@sumaris-net/ngx-components 1.18.0-rc1 → 1.18.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (33) hide show
  1. package/bundles/sumaris-net.ngx-components.umd.js +85 -80
  2. package/bundles/sumaris-net.ngx-components.umd.js.map +1 -1
  3. package/bundles/sumaris-net.ngx-components.umd.min.js +2 -2
  4. package/bundles/sumaris-net.ngx-components.umd.min.js.map +1 -1
  5. package/doc/changelog.md +4 -0
  6. package/esm2015/src/app/core/graphql/graphql.service.js +3 -2
  7. package/esm2015/src/app/core/services/config.service.js +3 -2
  8. package/esm2015/src/app/core/services/local-settings.service.js +2 -2
  9. package/esm2015/src/app/core/services/platform.service.js +12 -11
  10. package/esm2015/src/app/shared/directives/autofocus.directive.js +4 -2
  11. package/esm2015/src/app/shared/hotkeys/hotkeys.service.js +11 -7
  12. package/esm2015/src/app/shared/material/autocomplete/material.autocomplete.js +5 -4
  13. package/esm2015/src/app/shared/material/datetime/material.date.js +8 -9
  14. package/esm2015/src/app/shared/material/datetime/material.dateshort.js +8 -8
  15. package/esm2015/src/app/shared/material/datetime/material.datetime.js +7 -8
  16. package/esm2015/src/app/shared/material/datetime/testing/mat-date-time.test.js +3 -3
  17. package/esm2015/src/app/shared/material/datetime/testing/mat-date.test.js +4 -7
  18. package/esm2015/src/app/shared/material/latlong/material.latlong.js +4 -6
  19. package/esm2015/src/app/shared/platforms.js +2 -2
  20. package/esm2015/src/app/shared/services/entity-service.class.js +1 -1
  21. package/fesm2015/sumaris-net.ngx-components.js +76 -78
  22. package/fesm2015/sumaris-net.ngx-components.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/app/core/services/platform.service.d.ts +1 -1
  25. package/src/app/shared/directives/autofocus.directive.d.ts +2 -1
  26. package/src/app/shared/hotkeys/hotkeys.service.d.ts +3 -2
  27. package/src/app/shared/material/datetime/material.date.d.ts +2 -4
  28. package/src/app/shared/material/datetime/material.dateshort.d.ts +2 -3
  29. package/src/app/shared/material/datetime/material.datetime.d.ts +1 -3
  30. package/src/app/shared/material/datetime/testing/mat-date.test.d.ts +1 -3
  31. package/src/app/shared/material/latlong/material.latlong.d.ts +1 -3
  32. package/src/app/shared/services/entity-service.class.d.ts +4 -1
  33. package/sumaris-net.ngx-components.metadata.json +1 -1
@@ -8,7 +8,7 @@ export const testUserAgent = (win, expr) => {
8
8
  };
9
9
  export const isWindows = (win) => testUserAgent(win, /windows/i);
10
10
  export const isTouchUi = (win) => matchMedia(win, '(any-pointer:coarse)');
11
- export const isMobile = (win) => isTouchUi(win) && !isWindows(win);
11
+ export const isMobile = (win) => isCordova(window) || isAndroid(win) || isIOS(window) || (isTouchUi(win) && !isWindows(win));
12
12
  const isIpad = (win) => {
13
13
  // iOS 12 and below
14
14
  if (testUserAgent(win, /iPad/i)) {
@@ -25,4 +25,4 @@ export const isIOS = (win) => testUserAgent(win, /iPhone|iPod/i) || isIpad(win);
25
25
  export const isAndroid = (win) => testUserAgent(win, /android|sink/i);
26
26
  export const isCordova = (win) => !!(win['cordova'] || win['phonegap'] || win['PhoneGap']);
27
27
  export { ɵ0 };
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvcGxhdGZvcm1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztTQUVTO0FBRVQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQWEsRUFBVyxFQUFFLENBQ2hFLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO0FBRWhDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQVcsRUFBRSxJQUFZLEVBQUUsRUFBRTtJQUN6RCxNQUFNLFNBQVMsR0FBVyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSyxNQUFjLENBQUMsS0FBSyxDQUFDO0lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM5QixDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFZLEVBQUUsRUFBRSxDQUN4QyxhQUFhLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBRWpDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQVksRUFBRSxFQUFFLENBQ3hDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztBQUUxQyxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUN0QyxTQUFTLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFcEMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRTtJQUM3QixtQkFBbUI7SUFDbkIsSUFBSSxhQUFhLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxFQUFFO1FBQy9CLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFRCxVQUFVO0lBQ1YsSUFBSSxhQUFhLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUNyRCxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDLENBQUM7O0FBRUYsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FDbkMsYUFBYSxDQUFDLEdBQUcsRUFBRSxjQUFjLENBQUMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7QUFFcEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUUsQ0FDdkMsYUFBYSxDQUFDLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFRLEVBQVcsRUFBRSxDQUM3QyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyogLS0tXG4gKiBTb3VyY2U6IGh0dHBzOi8vZ2l0aHViLmNvbS9pb25pYy10ZWFtL2lvbmljLWZyYW1ld29yay9ibG9iL2IwZDUzY2E3MzYxOTU4NTY3MWQ4Y2Y0ZGMyNGU0N2Y4MjY0OTVhMGEvY29yZS9zcmMvdXRpbHMvcGxhdGZvcm0udHNcbiAqIC0tLSAqL1xuXG5leHBvcnQgY29uc3QgbWF0Y2hNZWRpYSA9ICh3aW46IFdpbmRvdywgcXVlcnk6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgd2luLm1hdGNoTWVkaWEocXVlcnkpLm1hdGNoZXM7XG5cbmV4cG9ydCBjb25zdCB0ZXN0VXNlckFnZW50ID0gKHdpbjogV2luZG93LCBleHByOiBSZWdFeHApID0+IHtcbiAgY29uc3QgdXNlckFnZW50OiBzdHJpbmcgPSB3aW4ubmF2aWdhdG9yLnVzZXJBZ2VudCB8fCB3aW4ubmF2aWdhdG9yLnZlbmRvciB8fCAod2luZG93IGFzIGFueSkub3BlcmE7XG4gIHJldHVybiBleHByLnRlc3QodXNlckFnZW50KTtcbn1cblxuZXhwb3J0IGNvbnN0IGlzV2luZG93cyA9ICh3aW4/OiBXaW5kb3cpID0+XG4gIHRlc3RVc2VyQWdlbnQod2luLCAvd2luZG93cy9pKTtcblxuZXhwb3J0IGNvbnN0IGlzVG91Y2hVaSA9ICh3aW4/OiBXaW5kb3cpID0+XG4gIG1hdGNoTWVkaWEod2luLCAnKGFueS1wb2ludGVyOmNvYXJzZSknKTtcblxuZXhwb3J0IGNvbnN0IGlzTW9iaWxlID0gKHdpbjogV2luZG93KSA9PlxuICBpc1RvdWNoVWkod2luKSAmJiAhaXNXaW5kb3dzKHdpbik7XG5cbmNvbnN0IGlzSXBhZCA9ICh3aW46IFdpbmRvdykgPT4ge1xuICAvLyBpT1MgMTIgYW5kIGJlbG93XG4gIGlmICh0ZXN0VXNlckFnZW50KHdpbiwgL2lQYWQvaSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIGlPUyAxMytcbiAgaWYgKHRlc3RVc2VyQWdlbnQod2luLCAvTWFjaW50b3NoL2kpICYmIGlzTW9iaWxlKHdpbikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn07XG5cbmV4cG9ydCBjb25zdCBpc0lPUyA9ICh3aW46IFdpbmRvdykgPT5cbiAgdGVzdFVzZXJBZ2VudCh3aW4sIC9pUGhvbmV8aVBvZC9pKSB8fCBpc0lwYWQod2luKTtcblxuZXhwb3J0IGNvbnN0IGlzQW5kcm9pZCA9ICh3aW46IFdpbmRvdykgPT5cbiAgdGVzdFVzZXJBZ2VudCh3aW4sIC9hbmRyb2lkfHNpbmsvaSk7XG5cbmV4cG9ydCBjb25zdCBpc0NvcmRvdmEgPSAod2luOiBhbnkpOiBib29sZWFuID0+XG4gICEhKHdpblsnY29yZG92YSddIHx8IHdpblsncGhvbmVnYXAnXSB8fCB3aW5bJ1Bob25lR2FwJ10pO1xuIl19
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vc3JjL2FwcC9zaGFyZWQvcGxhdGZvcm1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztTQUVTO0FBRVQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBVyxFQUFFLEtBQWEsRUFBVyxFQUFFLENBQ2hFLEdBQUcsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO0FBRWhDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQVcsRUFBRSxJQUFZLEVBQUUsRUFBRTtJQUN6RCxNQUFNLFNBQVMsR0FBVyxHQUFHLENBQUMsU0FBUyxDQUFDLFNBQVMsSUFBSSxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sSUFBSyxNQUFjLENBQUMsS0FBSyxDQUFDO0lBQ25HLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM5QixDQUFDLENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFZLEVBQUUsRUFBRSxDQUN4QyxhQUFhLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBRWpDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQVksRUFBRSxFQUFFLENBQ3hDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztBQUUxQyxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFXLEVBQUUsRUFBRSxDQUN0QyxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRTlGLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBVyxFQUFFLEVBQUU7SUFDN0IsbUJBQW1CO0lBQ25CLElBQUksYUFBYSxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsRUFBRTtRQUMvQixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsVUFBVTtJQUNWLElBQUksYUFBYSxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDckQsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyxDQUFDOztBQUVGLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQ25DLGFBQWEsQ0FBQyxHQUFHLEVBQUUsY0FBYyxDQUFDLElBQUksTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRXBELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFLENBQ3ZDLGFBQWEsQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBUSxFQUFXLEVBQUUsQ0FDN0MsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qIC0tLVxuICogU291cmNlOiBodHRwczovL2dpdGh1Yi5jb20vaW9uaWMtdGVhbS9pb25pYy1mcmFtZXdvcmsvYmxvYi9iMGQ1M2NhNzM2MTk1ODU2NzFkOGNmNGRjMjRlNDdmODI2NDk1YTBhL2NvcmUvc3JjL3V0aWxzL3BsYXRmb3JtLnRzXG4gKiAtLS0gKi9cblxuZXhwb3J0IGNvbnN0IG1hdGNoTWVkaWEgPSAod2luOiBXaW5kb3csIHF1ZXJ5OiBzdHJpbmcpOiBib29sZWFuID0+XG4gIHdpbi5tYXRjaE1lZGlhKHF1ZXJ5KS5tYXRjaGVzO1xuXG5leHBvcnQgY29uc3QgdGVzdFVzZXJBZ2VudCA9ICh3aW46IFdpbmRvdywgZXhwcjogUmVnRXhwKSA9PiB7XG4gIGNvbnN0IHVzZXJBZ2VudDogc3RyaW5nID0gd2luLm5hdmlnYXRvci51c2VyQWdlbnQgfHwgd2luLm5hdmlnYXRvci52ZW5kb3IgfHwgKHdpbmRvdyBhcyBhbnkpLm9wZXJhO1xuICByZXR1cm4gZXhwci50ZXN0KHVzZXJBZ2VudCk7XG59XG5cbmV4cG9ydCBjb25zdCBpc1dpbmRvd3MgPSAod2luPzogV2luZG93KSA9PlxuICB0ZXN0VXNlckFnZW50KHdpbiwgL3dpbmRvd3MvaSk7XG5cbmV4cG9ydCBjb25zdCBpc1RvdWNoVWkgPSAod2luPzogV2luZG93KSA9PlxuICBtYXRjaE1lZGlhKHdpbiwgJyhhbnktcG9pbnRlcjpjb2Fyc2UpJyk7XG5cbmV4cG9ydCBjb25zdCBpc01vYmlsZSA9ICh3aW46IFdpbmRvdykgPT5cbiAgaXNDb3Jkb3ZhKHdpbmRvdykgfHwgaXNBbmRyb2lkKHdpbikgfHwgaXNJT1Mod2luZG93KSB8fCAoaXNUb3VjaFVpKHdpbikgJiYgIWlzV2luZG93cyh3aW4pKTtcblxuY29uc3QgaXNJcGFkID0gKHdpbjogV2luZG93KSA9PiB7XG4gIC8vIGlPUyAxMiBhbmQgYmVsb3dcbiAgaWYgKHRlc3RVc2VyQWdlbnQod2luLCAvaVBhZC9pKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLy8gaU9TIDEzK1xuICBpZiAodGVzdFVzZXJBZ2VudCh3aW4sIC9NYWNpbnRvc2gvaSkgJiYgaXNNb2JpbGUod2luKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxuZXhwb3J0IGNvbnN0IGlzSU9TID0gKHdpbjogV2luZG93KSA9PlxuICB0ZXN0VXNlckFnZW50KHdpbiwgL2lQaG9uZXxpUG9kL2kpIHx8IGlzSXBhZCh3aW4pO1xuXG5leHBvcnQgY29uc3QgaXNBbmRyb2lkID0gKHdpbjogV2luZG93KSA9PlxuICB0ZXN0VXNlckFnZW50KHdpbiwgL2FuZHJvaWR8c2luay9pKTtcblxuZXhwb3J0IGNvbnN0IGlzQ29yZG92YSA9ICh3aW46IGFueSk6IGJvb2xlYW4gPT5cbiAgISEod2luWydjb3Jkb3ZhJ10gfHwgd2luWydwaG9uZWdhcCddIHx8IHdpblsnUGhvbmVHYXAnXSk7XG4iXX0=
@@ -14,4 +14,4 @@ export class EntitiesService {
14
14
  EntitiesService.decorators = [
15
15
  { type: Directive }
16
16
  ];
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXNlcnZpY2UuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUMsU0FBUyxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBNkZuRCxNQUFNLFVBQVUsZUFBZSxDQUFJLElBQW1CLEVBQUUsSUFBbUI7O0lBQ3pFLE9BQU87UUFDTCxJQUFJLEVBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDN0MsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxXQUFJLElBQUksQ0FBQyxJQUFJLDBDQUFFLE1BQU0sQ0FBQSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssV0FBSSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxNQUFNLENBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUN6RixDQUFDO0FBQ0osQ0FBQztBQUdELE1BQU0sT0FBZ0IsZUFBZTtJQUduQyxXQUFXO1FBQ1QsZ0NBQWdDO0lBQ2xDLENBQUM7OztZQU5GLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtGZXRjaFBvbGljeSwgV2F0Y2hRdWVyeUZldGNoUG9saWN5fSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcbmltcG9ydCB7U29ydERpcmVjdGlvbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQge0RpcmVjdGl2ZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RW1wdHlPYmplY3R9IGZyb20gJ2Fwb2xsby1hbmd1bGFyL3R5cGVzJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFBhZ2Uge1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgc2l6ZTogbnVtYmVyO1xuICBzb3J0Qnk/OiBzdHJpbmc7XG4gIHNvcnREaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9uO1xufVxuXG5leHBvcnQgZGVjbGFyZSB0eXBlIEZldGNoTW9yZUZuPFIsIFYgPSBFbXB0eU9iamVjdD4gPSAodmFyaWFibGVzPzogVikgPT4gUHJvbWlzZTxSPjtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIExvYWRSZXN1bHQ8VD4ge1xuICBkYXRhOiBUW107XG4gIHRvdGFsPzogbnVtYmVyO1xuICBlcnJvcnM/OiBhbnlbXTtcbiAgZmV0Y2hNb3JlPzogRmV0Y2hNb3JlRm48TG9hZFJlc3VsdDxUPj47XG59XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgU3VnZ2VzdEZuPFQsIEY+ID0gKHZhbHVlOiBhbnksIGZpbHRlcj86IEYsIHNvcnRCeT86IHN0cmluZywgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24pID0+IFByb21pc2U8VFtdIHwgTG9hZFJlc3VsdDxUPj47XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBTdWdnZXN0U2VydmljZTxULCBGPiB7XG4gIHN1Z2dlc3Q6IFN1Z2dlc3RGbjxULCBGPjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgdHlwZSBGaWx0ZXJGbjxUPiA9IChkYXRhOiBUKSA9PiBib29sZWFuO1xuZXhwb3J0IGRlY2xhcmUgdHlwZSBGaWx0ZXJGbkZhY3Rvcnk8VCwgRj4gPSAoZmlsdGVyOiBGKSA9PiBGaWx0ZXJGbjxUPjtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEVudGl0eVNlcnZpY2VMb2FkT3B0aW9ucyB7XG4gIGZldGNoUG9saWN5PzogRmV0Y2hQb2xpY3k7XG4gIHRyYXNoPzogYm9vbGVhbjtcbiAgdG9FbnRpdHk/OiBib29sZWFuO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJRW50aXR5U2VydmljZTxcbiAgVCxcbiAgSUQgPSBhbnksXG4gIExPID0gRW50aXR5U2VydmljZUxvYWRPcHRpb25zPiB7XG5cbiAgbG9hZChcbiAgICBpZDogSUQsXG4gICAgb3B0cz86IExPXG4gICk6IFByb21pc2U8VD47XG5cbiAgY2FuVXNlcldyaXRlKGRhdGE6IFQsIG9wdHM/OiBhbnkpOiBib29sZWFuO1xuXG4gIHNhdmUoZGF0YTogVCwgb3B0cz86IGFueSk6IFByb21pc2U8VD47XG5cbiAgZGVsZXRlKGRhdGE6IFQsIG9wdHM/OiBhbnkpOiBQcm9taXNlPGFueT47XG5cbiAgbGlzdGVuQ2hhbmdlcyhpZDogSUQsIG9wdHM/OiBhbnkpOiBPYnNlcnZhYmxlPFQgfCB1bmRlZmluZWQ+O1xufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zIHtcbiAgZmV0Y2hQb2xpY3k/OiBXYXRjaFF1ZXJ5RmV0Y2hQb2xpY3k7XG4gIHRyYXNoPzogYm9vbGVhbjtcbiAgd2l0aFRvdGFsPzogYm9vbGVhbjtcbiAgdG9FbnRpdHk/OiBib29sZWFuO1xuICBba2V5OiBzdHJpbmddOiBhbnk7XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJRW50aXRpZXNTZXJ2aWNlPFQsIEYsIE8gZXh0ZW5kcyBFbnRpdGllc1NlcnZpY2VXYXRjaE9wdGlvbnMgPSBFbnRpdGllc1NlcnZpY2VXYXRjaE9wdGlvbnM+IHtcblxuICB3YXRjaEFsbChcbiAgICBvZmZzZXQ6IG51bWJlcixcbiAgICBzaXplOiBudW1iZXIsXG4gICAgc29ydEJ5Pzogc3RyaW5nLFxuICAgIHNvcnREaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9uLFxuICAgIGZpbHRlcj86IFBhcnRpYWw8Rj4sXG4gICAgb3B0aW9ucz86IE9cbiAgKTogT2JzZXJ2YWJsZTxMb2FkUmVzdWx0PFQ+PjtcblxuICAvLyBUT0RPXG4gIC8qd2F0Y2hQYWdlKFxuICAgIHBhZ2U6IFBhZ2U8VD4sXG4gICAgZmlsdGVyPzogRixcbiAgICBvcHRpb25zPzogT1xuICApOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+OyovXG5cbiAgc2F2ZUFsbChkYXRhOiBUW10sIG9wdHM/OiBhbnkpOiBQcm9taXNlPFRbXT47XG5cbiAgZGVsZXRlQWxsKGRhdGE6IFRbXSwgb3B0cz86IGFueSk6IFByb21pc2U8YW55PjtcblxuICBhc0ZpbHRlcihmaWx0ZXI6IFBhcnRpYWw8Rj4pOiBGO1xufVxuXG5leHBvcnQgZGVjbGFyZSB0eXBlIExvYWRSZXN1bHRCeVBhZ2VGbjxUPiA9IChvZmZzZXQ6IG51bWJlciwgc2l6ZTogbnVtYmVyKSA9PiBQcm9taXNlPExvYWRSZXN1bHQ8VD4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIElFbnRpdHlGdWxsU2VydmljZTxULCBJRCwgRiwgTyBleHRlbmRzIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyAmIEVudGl0eVNlcnZpY2VMb2FkT3B0aW9ucz5cbiAgZXh0ZW5kcyBJRW50aXR5U2VydmljZTxULCBJRCwgTz4sIElFbnRpdGllc1NlcnZpY2U8VCwgRiwgTz4gIHtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlTG9hZFJlc3VsdDxUPihyZXMxOiBMb2FkUmVzdWx0PFQ+LCByZXMyOiBMb2FkUmVzdWx0PFQ+KTogTG9hZFJlc3VsdDxUPiB7XG4gIHJldHVybiB7XG4gICAgZGF0YSA6IChyZXMxLmRhdGEgfHwgW10pLmNvbmNhdCguLi5yZXMyLmRhdGEpLFxuICAgIHRvdGFsOiAoKHJlczEudG90YWwgfHwgcmVzMS5kYXRhPy5sZW5ndGggfHwgMCkgKyAocmVzMi50b3RhbCB8fCByZXMyLmRhdGE/Lmxlbmd0aCB8fCAwKSlcbiAgfTtcbn1cblxuQERpcmVjdGl2ZSgpXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgRW50aXRpZXNTZXJ2aWNlPFQsIEYsIE8gZXh0ZW5kcyBFbnRpdGllc1NlcnZpY2VXYXRjaE9wdGlvbnMgPSBFbnRpdGllc1NlcnZpY2VXYXRjaE9wdGlvbnM+XG4gIGltcGxlbWVudHMgSUVudGl0aWVzU2VydmljZTxULCBGLCBPPiwgT25EZXN0cm95IHtcblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICAvLyBDYW4gYmUgb3ZlcnJpZGUgYnkgc3ViY2xhc3Nlc1xuICB9XG5cbiAgYWJzdHJhY3Qgd2F0Y2hBbGwoXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIHNvcnRCeT86IHN0cmluZyxcbiAgICBzb3J0RGlyZWN0aW9uPzogU29ydERpcmVjdGlvbixcbiAgICBmaWx0ZXI/OiBQYXJ0aWFsPEY+LFxuICAgIG9wdGlvbnM/OiBPXG4gICk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxUPj47XG5cbiAgLy8gVE9ET1xuICAvKndhdGNoUGFnZShcbiAgICBwYWdlOiBQYWdlPFQ+LFxuICAgIGZpbHRlcj86IEYsXG4gICAgb3B0aW9ucz86IE9cbiAgKTogT2JzZXJ2YWJsZTxMb2FkUmVzdWx0PFQ+PjsqL1xuXG4gIGFic3RyYWN0IHNhdmVBbGwoZGF0YTogVFtdLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxUW10+O1xuXG4gIGFic3RyYWN0IGRlbGV0ZUFsbChkYXRhOiBUW10sIG9wdGlvbnM/OiBhbnkpOiBQcm9taXNlPGFueT47XG5cbiAgYWJzdHJhY3QgYXNGaWx0ZXIoZmlsdGVyOiBQYXJ0aWFsPEY+KTogRjtcbn1cbiJdfQ==
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW50aXR5LXNlcnZpY2UuY2xhc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9zcmMvYXBwL3NoYXJlZC9zZXJ2aWNlcy9lbnRpdHktc2VydmljZS5jbGFzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUMsU0FBUyxFQUFZLE1BQU0sZUFBZSxDQUFDO0FBbUduRCxNQUFNLFVBQVUsZUFBZSxDQUFJLElBQW1CLEVBQUUsSUFBbUI7O0lBQ3pFLE9BQU87UUFDTCxJQUFJLEVBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDN0MsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxXQUFJLElBQUksQ0FBQyxJQUFJLDBDQUFFLE1BQU0sQ0FBQSxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssV0FBSSxJQUFJLENBQUMsSUFBSSwwQ0FBRSxNQUFNLENBQUEsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUN6RixDQUFDO0FBQ0osQ0FBQztBQUdELE1BQU0sT0FBZ0IsZUFBZTtJQUduQyxXQUFXO1FBQ1QsZ0NBQWdDO0lBQ2xDLENBQUM7OztZQU5GLFNBQVMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtGZXRjaFBvbGljeSwgV2F0Y2hRdWVyeUZldGNoUG9saWN5fSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcbmltcG9ydCB7U29ydERpcmVjdGlvbn0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvc29ydCc7XG5pbXBvcnQge0RpcmVjdGl2ZSwgT25EZXN0cm95fSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RW1wdHlPYmplY3R9IGZyb20gJ2Fwb2xsby1hbmd1bGFyL3R5cGVzJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFBhZ2Uge1xuICBvZmZzZXQ6IG51bWJlcjtcbiAgc2l6ZTogbnVtYmVyO1xuICBzb3J0Qnk/OiBzdHJpbmc7XG4gIHNvcnREaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9uO1xufVxuXG5leHBvcnQgZGVjbGFyZSB0eXBlIEZldGNoTW9yZUZuPFIsIFYgPSBFbXB0eU9iamVjdD4gPSAodmFyaWFibGVzPzogVikgPT4gUHJvbWlzZTxSPjtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIExvYWRSZXN1bHQ8VD4ge1xuICBkYXRhOiBUW107XG4gIHRvdGFsPzogbnVtYmVyO1xuICBlcnJvcnM/OiBhbnlbXTtcbiAgZmV0Y2hNb3JlPzogRmV0Y2hNb3JlRm48TG9hZFJlc3VsdDxUPj47XG59XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgU3VnZ2VzdEZuPFQsIEY+ID0gKHZhbHVlOiBhbnksIGZpbHRlcj86IEYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3J0Qnk/OiBzdHJpbmd8a2V5b2YgVCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnREaXJlY3Rpb24/OiBTb3J0RGlyZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0cz86IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hQb2xpY3k6IEZldGNoUG9saWN5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBba2V5OiBzdHJpbmddOiBhbnk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSA9PiBQcm9taXNlPFRbXSB8IExvYWRSZXN1bHQ8VD4+O1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgU3VnZ2VzdFNlcnZpY2U8VCwgRj4ge1xuICBzdWdnZXN0OiBTdWdnZXN0Rm48VCwgRj47XG59XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgRmlsdGVyRm48VD4gPSAoZGF0YTogVCkgPT4gYm9vbGVhbjtcbmV4cG9ydCBkZWNsYXJlIHR5cGUgRmlsdGVyRm5GYWN0b3J5PFQsIEY+ID0gKGZpbHRlcjogRikgPT4gRmlsdGVyRm48VD47XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBFbnRpdHlTZXJ2aWNlTG9hZE9wdGlvbnMge1xuICBmZXRjaFBvbGljeT86IEZldGNoUG9saWN5O1xuICB0cmFzaD86IGJvb2xlYW47XG4gIHRvRW50aXR5PzogYm9vbGVhbjtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSUVudGl0eVNlcnZpY2U8XG4gIFQsXG4gIElEID0gYW55LFxuICBMTyA9IEVudGl0eVNlcnZpY2VMb2FkT3B0aW9ucz4ge1xuXG4gIGxvYWQoXG4gICAgaWQ6IElELFxuICAgIG9wdHM/OiBMT1xuICApOiBQcm9taXNlPFQ+O1xuXG4gIGNhblVzZXJXcml0ZShkYXRhOiBULCBvcHRzPzogYW55KTogYm9vbGVhbjtcblxuICBzYXZlKGRhdGE6IFQsIG9wdHM/OiBhbnkpOiBQcm9taXNlPFQ+O1xuXG4gIGRlbGV0ZShkYXRhOiBULCBvcHRzPzogYW55KTogUHJvbWlzZTxhbnk+O1xuXG4gIGxpc3RlbkNoYW5nZXMoaWQ6IElELCBvcHRzPzogYW55KTogT2JzZXJ2YWJsZTxUIHwgdW5kZWZpbmVkPjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEVudGl0aWVzU2VydmljZVdhdGNoT3B0aW9ucyB7XG4gIGZldGNoUG9saWN5PzogV2F0Y2hRdWVyeUZldGNoUG9saWN5O1xuICB0cmFzaD86IGJvb2xlYW47XG4gIHdpdGhUb3RhbD86IGJvb2xlYW47XG4gIHRvRW50aXR5PzogYm9vbGVhbjtcbiAgW2tleTogc3RyaW5nXTogYW55O1xufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSUVudGl0aWVzU2VydmljZTxULCBGLCBPIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zPiB7XG5cbiAgd2F0Y2hBbGwoXG4gICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgc2l6ZTogbnVtYmVyLFxuICAgIHNvcnRCeT86IHN0cmluZyxcbiAgICBzb3J0RGlyZWN0aW9uPzogU29ydERpcmVjdGlvbixcbiAgICBmaWx0ZXI/OiBQYXJ0aWFsPEY+LFxuICAgIG9wdGlvbnM/OiBPXG4gICk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxUPj47XG5cbiAgLy8gVE9ET1xuICAvKndhdGNoUGFnZShcbiAgICBwYWdlOiBQYWdlPFQ+LFxuICAgIGZpbHRlcj86IEYsXG4gICAgb3B0aW9ucz86IE9cbiAgKTogT2JzZXJ2YWJsZTxMb2FkUmVzdWx0PFQ+PjsqL1xuXG4gIHNhdmVBbGwoZGF0YTogVFtdLCBvcHRzPzogYW55KTogUHJvbWlzZTxUW10+O1xuXG4gIGRlbGV0ZUFsbChkYXRhOiBUW10sIG9wdHM/OiBhbnkpOiBQcm9taXNlPGFueT47XG5cbiAgYXNGaWx0ZXIoZmlsdGVyOiBQYXJ0aWFsPEY+KTogRjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgdHlwZSBMb2FkUmVzdWx0QnlQYWdlRm48VD4gPSAob2Zmc2V0OiBudW1iZXIsIHNpemU6IG51bWJlcikgPT4gUHJvbWlzZTxMb2FkUmVzdWx0PFQ+PjtcblxuZXhwb3J0IGludGVyZmFjZSBJRW50aXR5RnVsbFNlcnZpY2U8VCwgSUQsIEYsIE8gZXh0ZW5kcyBFbnRpdGllc1NlcnZpY2VXYXRjaE9wdGlvbnMgJiBFbnRpdHlTZXJ2aWNlTG9hZE9wdGlvbnM+XG4gIGV4dGVuZHMgSUVudGl0eVNlcnZpY2U8VCwgSUQsIE8+LCBJRW50aXRpZXNTZXJ2aWNlPFQsIEYsIE8+ICB7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZXJnZUxvYWRSZXN1bHQ8VD4ocmVzMTogTG9hZFJlc3VsdDxUPiwgcmVzMjogTG9hZFJlc3VsdDxUPik6IExvYWRSZXN1bHQ8VD4ge1xuICByZXR1cm4ge1xuICAgIGRhdGEgOiAocmVzMS5kYXRhIHx8IFtdKS5jb25jYXQoLi4ucmVzMi5kYXRhKSxcbiAgICB0b3RhbDogKChyZXMxLnRvdGFsIHx8IHJlczEuZGF0YT8ubGVuZ3RoIHx8IDApICsgKHJlczIudG90YWwgfHwgcmVzMi5kYXRhPy5sZW5ndGggfHwgMCkpXG4gIH07XG59XG5cbkBEaXJlY3RpdmUoKVxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEVudGl0aWVzU2VydmljZTxULCBGLCBPIGV4dGVuZHMgRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zID0gRW50aXRpZXNTZXJ2aWNlV2F0Y2hPcHRpb25zPlxuICBpbXBsZW1lbnRzIElFbnRpdGllc1NlcnZpY2U8VCwgRiwgTz4sIE9uRGVzdHJveSB7XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgLy8gQ2FuIGJlIG92ZXJyaWRlIGJ5IHN1YmNsYXNzZXNcbiAgfVxuXG4gIGFic3RyYWN0IHdhdGNoQWxsKFxuICAgIG9mZnNldDogbnVtYmVyLFxuICAgIHNpemU6IG51bWJlcixcbiAgICBzb3J0Qnk/OiBzdHJpbmcsXG4gICAgc29ydERpcmVjdGlvbj86IFNvcnREaXJlY3Rpb24sXG4gICAgZmlsdGVyPzogUGFydGlhbDxGPixcbiAgICBvcHRpb25zPzogT1xuICApOiBPYnNlcnZhYmxlPExvYWRSZXN1bHQ8VD4+O1xuXG4gIC8vIFRPRE9cbiAgLyp3YXRjaFBhZ2UoXG4gICAgcGFnZTogUGFnZTxUPixcbiAgICBmaWx0ZXI/OiBGLFxuICAgIG9wdGlvbnM/OiBPXG4gICk6IE9ic2VydmFibGU8TG9hZFJlc3VsdDxUPj47Ki9cblxuICBhYnN0cmFjdCBzYXZlQWxsKGRhdGE6IFRbXSwgb3B0aW9ucz86IGFueSk6IFByb21pc2U8VFtdPjtcblxuICBhYnN0cmFjdCBkZWxldGVBbGwoZGF0YTogVFtdLCBvcHRpb25zPzogYW55KTogUHJvbWlzZTxhbnk+O1xuXG4gIGFic3RyYWN0IGFzRmlsdGVyKGZpbHRlcjogUGFydGlhbDxGPik6IEY7XG59XG4iXX0=
@@ -42,7 +42,7 @@ import { trigger, transition, style, animate, state } from '@angular/animations'
42
42
  import * as i1$1 from '@ngx-translate/core';
43
43
  import { TranslateService, TranslateModule } from '@ngx-translate/core';
44
44
  import * as i1$4 from '@ionic/angular';
45
- import { IonicModule, Platform, IonRouterOutlet, ModalController, IonicSafeString, createAnimation, ToastController, PopoverController, AlertController, IonicRouteStrategy, NavParams, MenuController, IonContent, IonInfiniteScroll } from '@ionic/angular';
45
+ import { IonicModule, Platform, IonRouterOutlet, ModalController, PopoverController, IonicSafeString, createAnimation, ToastController, AlertController, IonicRouteStrategy, NavParams, MenuController, IonContent, IonInfiniteScroll } from '@ionic/angular';
46
46
  import * as momentImported from 'moment';
47
47
  import { isMoment } from 'moment';
48
48
  import * as i1 from '@angular/material-moment-adapter';
@@ -1060,6 +1060,33 @@ trigger('slideUpDownAnimation', [
1060
1060
  ])
1061
1061
  ]);
1062
1062
 
1063
+ /* ---
1064
+ * Source: https://github.com/ionic-team/ionic-framework/blob/b0d53ca73619585671d8cf4dc24e47f826495a0a/core/src/utils/platform.ts
1065
+ * --- */
1066
+ const matchMedia = (win, query) => win.matchMedia(query).matches;
1067
+ const testUserAgent = (win, expr) => {
1068
+ const userAgent = win.navigator.userAgent || win.navigator.vendor || window.opera;
1069
+ return expr.test(userAgent);
1070
+ };
1071
+ const isWindows = (win) => testUserAgent(win, /windows/i);
1072
+ const isTouchUi = (win) => matchMedia(win, '(any-pointer:coarse)');
1073
+ const isMobile = (win) => isCordova(window) || isAndroid(win) || isIOS(window) || (isTouchUi(win) && !isWindows(win));
1074
+ const isIpad = (win) => {
1075
+ // iOS 12 and below
1076
+ if (testUserAgent(win, /iPad/i)) {
1077
+ return true;
1078
+ }
1079
+ // iOS 13+
1080
+ if (testUserAgent(win, /Macintosh/i) && isMobile(win)) {
1081
+ return true;
1082
+ }
1083
+ return false;
1084
+ };
1085
+ const ɵ0$c = isIpad;
1086
+ const isIOS = (win) => testUserAgent(win, /iPhone|iPod/i) || isIpad(win);
1087
+ const isAndroid = (win) => testUserAgent(win, /android|sink/i);
1088
+ const isCordova = (win) => !!(win['cordova'] || win['phonegap'] || win['PhoneGap']);
1089
+
1063
1090
  class MatAutocompleteConfigHolder {
1064
1091
  constructor(options) {
1065
1092
  this.options = options;
@@ -1115,7 +1142,7 @@ class MatAutocompleteFieldUtils {
1115
1142
  }
1116
1143
  }
1117
1144
  const noop$8 = (_) => { };
1118
- const ɵ0$c = noop$8;
1145
+ const ɵ0$b = noop$8;
1119
1146
  class MatAutocompleteField {
1120
1147
  constructor(cd, formGroupDir) {
1121
1148
  this.cd = cd;
@@ -1135,7 +1162,7 @@ class MatAutocompleteField {
1135
1162
  this.showLoadingSpinner = true;
1136
1163
  this.debug = false;
1137
1164
  this.showSearchBar = true;
1138
- this.stickySearchBar = true;
1165
+ this.stickySearchBar = false;
1139
1166
  this.clicked = new EventEmitter();
1140
1167
  this.blurred = new EventEmitter();
1141
1168
  this.focused = new EventEmitter();
@@ -1246,7 +1273,7 @@ class MatAutocompleteField {
1246
1273
  }
1247
1274
  // Default values
1248
1275
  this.multiple = toBoolean(this.multiple, false);
1249
- this.mobile = toBoolean(this.mobile, this.multiple);
1276
+ this.mobile = toBoolean(this.mobile, this.multiple || isMobile(window));
1250
1277
  this.displayAttributes = this.displayAttributes || ((_a = this.filter) === null || _a === void 0 ? void 0 : _a.attributes) || ['label', 'name'];
1251
1278
  this.displayWith = this.displayWith || MatAutocompleteFieldUtils.createDisplayFn(this.displayAttributes, this.multiple);
1252
1279
  this.equals = this.equals || MatAutocompleteFieldUtils.defaultEquals;
@@ -1778,7 +1805,7 @@ MatAutocompleteField.decorators = [
1778
1805
  { type: Component, args: [{
1779
1806
  // eslint-disable-next-line @angular-eslint/component-selector
1780
1807
  selector: 'mat-autocomplete-field',
1781
- template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <!-- readonly -->\n <mat-form-field *ngIf=\"_readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [title]=\"displayValue\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\" readonly>\n <ion-text>{{displayWith(value)}}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n\n <ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"displayValue\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <!-- Mobile or Mutliple (use <mat-select>) -->\n <mat-select #matSelect\n *ngIf=\"mobile || multiple; else desktopTemplate\"\n [disableRipple]=\"true\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"classList\"\n [style.width]=\"panelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\">\n <mat-select-trigger>{{ displayWith(value) }}</mat-select-trigger>\n\n <!-- Search bar -->\n <ion-searchbar *ngIf=\"showSearchBar\" #ionSearchbar\n class=\"mat-select-header\"\n [class.ion-searchbar-sticky]=\"stickySearchBar\"\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"true\"\n showClearButton\n [debounce]=\"debounceTime\"\n (ionClear)=\"ionSearchBarClear($event)\"\n (ionInput)=\"ionSearchBarChanged($event)\"\n [placeholder]=\"'COMMON.BTN_SEARCH'|translate\"\n ></ion-searchbar>\n\n <!-- Headers -->\n <ion-row class=\"mat-select-header column ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.ion-searchbar-sticky]=\"showSearchBar && stickySearchBar\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- None option -->\n <mat-option *ngIf=\"!required && !multiple\" class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- Options -->\n <ng-container *ngIf=\"$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></ion-label>\n </mat-option>\n\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path | highlight: { search: formControl.value, withAccent: highlightAccent }\"></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initMatSelectInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- footer -->\n <ion-row *ngIf=\"itemCount as count\"\n class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(displayValue | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n </mat-select>\n\n\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <ng-template #desktopTemplate>\n <input matInput #matInputText type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowdown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\">\n\n <!-- autocomplete -->\n <mat-autocomplete #autocomplete=\"matAutocomplete\"\n autoActiveFirstOption\n [displayWith]=\"displayWith\"\n [class]=\"classList\"\n [panelWidth]=\"panelWidth\">\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- Options -->\n <ng-container *ngIf=\"$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></ion-label>\n </mat-option>\n\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path | highlight: { search: formControl.value, withAccent: highlightAccent }\"></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initAutocompleteInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(displayValue | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n\n <!-- footer -->\n <ion-row *ngIf=\"itemCount; let count\" class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n </mat-autocomplete>\n\n </ng-template>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n <ng-content select=\"[matError]\"></ng-content>\n\n </mat-form-field>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\" class=\"ion-align-self-center\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n\n<ng-template #matSuffixTemplate>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"desktop\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\">\n <mat-icon class=\"large select-arrow\">arrow_drop_down</mat-icon>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #headers>\n <ion-row class=\"mat-autocomplete-header ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n</ng-template>\n\n<ng-template #options>\n\n\n</ng-template>\n\n",
1808
+ template: "<ion-grid class=\"ion-no-padding\">\n <ion-row>\n <ion-col class=\"ion-no-padding\">\n <!-- readonly -->\n <mat-form-field *ngIf=\"_readonly; else writable\"\n [floatLabel]=\"floatLabel\"\n [title]=\"displayValue\"\n class=\"mat-form-field-disabled\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <input matInput hidden type=\"text\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\" readonly>\n <ion-text>{{displayWith(value)}}</ion-text>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n </mat-form-field>\n\n <ng-template #writable>\n <mat-form-field [floatLabel]=\"floatLabel\"\n [class.mat-form-field-disabled]=\"disabled\"\n [title]=\"displayValue\">\n\n <div matPrefix>\n <ng-container *ngTemplateOutlet=\"matPrefixTemplate\"></ng-container>\n </div>\n\n <!-- Mobile or Mutliple (use <mat-select>) -->\n <mat-select #matSelect\n *ngIf=\"mobile || multiple; else desktopTemplate\"\n [disableRipple]=\"true\"\n [placeholder]=\"placeholder\"\n [formControl]=\"formControl\"\n [tabindex]=\"_tabindex\"\n [panelClass]=\"classList\"\n [style.width]=\"panelWidth\"\n (focus)=\"filterMatSelectFocusEvent($event)\"\n (blur)=\"filterMatSelectBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n [compareWith]=\"equals\"\n [multiple]=\"multiple\"\n [typeaheadDebounceInterval]=\"debounceTime * 10\"\n [required]=\"required\">\n <mat-select-trigger>{{ displayWith(value) }}</mat-select-trigger>\n\n <!-- Search bar -->\n <ion-searchbar *ngIf=\"showSearchBar\" #ionSearchbar\n class=\"mat-select-header\"\n [class.ion-searchbar-sticky]=\"stickySearchBar\"\n inputmode=\"search\"\n autocomplete=\"off\"\n animated=\"true\"\n showClearButton\n [debounce]=\"debounceTime\"\n (ionClear)=\"ionSearchBarClear($event)\"\n (ionInput)=\"ionSearchBarChanged($event)\"\n [placeholder]=\"'COMMON.BTN_SEARCH'|translate\"\n ></ion-searchbar>\n\n <!-- Headers -->\n <ion-row class=\"mat-select-header column ion-no-padding\"\n [class.multiple]=\"multiple\"\n [class.ion-searchbar-sticky]=\"showSearchBar && stickySearchBar\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- None option -->\n <mat-option *ngIf=\"!required && !multiple && !clearable\" class=\"ion-no-padding\">\n <ion-row class=\"ion-no-padding\">\n <ion-col class=\"ion-no-padding\">\n <ion-label><i translate>COMMON.EMPTY_OPTION</i></ion-label>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <ng-container *ngIf=\"$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></ion-label>\n </mat-option>\n\n <!-- Options -->\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path\"></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initMatSelectInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- footer -->\n <ion-row *ngIf=\"itemCount as count\"\n class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(displayValue | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n </mat-select>\n\n\n <!--\n NOTE :\n - \"selectInputContent($event) || onFocus.emit($event)\" : call onFocus only when to the input is empty (nothing to select)\n -->\n <ng-template #desktopTemplate>\n <input matInput #matInputText type=\"text\"\n [matAutocomplete]=\"autocomplete\"\n [matAutocompletePosition]=\"matAutocompletePosition\"\n [formControl]=\"formControl\"\n [placeholder]=\"placeholder\"\n [appAutofocus]=\"autofocus\"\n [tabindex]=\"_tabindex\"\n [required]=\"required\"\n (click)=\"clicked.emit($event)\"\n (focus)=\"filterInputTextFocusEvent($event)\"\n (blur)=\"filterInputTextBlurEvent($event)\"\n (keydown.escape)=\"keydownEscape.emit($event)\"\n (keyup.enter)=\"keyupEnter.emit($event)\"\n (keyup.arrowdown)=\"!autocomplete.showPanel && dropButtonClick.emit($event)\">\n\n <!-- autocomplete -->\n <mat-autocomplete #autocomplete=\"matAutocomplete\"\n autoActiveFirstOption\n [displayWith]=\"displayWith\"\n [class]=\"classList\"\n [panelWidth]=\"panelWidth\">\n <!-- Headers -->\n <ion-row class=\"mat-autocomplete-header column ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n\n <!-- Options -->\n <ng-container *ngIf=\"$filteredItems | async as items; else loadingTemplate\">\n <!-- No item option -->\n <mat-option *ngIf=\"items | isEmptyArray\" class=\"ion-padding text-italic\" disabled>\n <ion-label><i>{{noResultMessage | translate}}</i></ion-label>\n </mat-option>\n\n <mat-option *ngFor=\"let item of items\" [value]=\"item\" class=\"ion-no-padding\">\n <ion-row [classList]=\"item.classList\">\n <ion-col *ngFor=\"let path of displayAttributes; index as i;\"\n [size]=\"displayColumnSizes[i]\">\n <ion-text [innerHTML]=\"item | propertyGet: path | highlight: { search: formControl.value, withAccent: highlightAccent }\"></ion-text>\n </ion-col>\n </ion-row>\n </mat-option>\n\n <!-- More item -->\n <mat-option *ngIf=\"_moreItemsCount\" (ngInit)=\"_initAutocompleteInfiniteScroll()\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-container>\n\n <!-- Loading spinner -->\n <ng-template #loadingTemplate>\n <mat-option *ngIf=\"(displayValue | strLength) >= suggestLengthThreshold; else waitMoreCharacterTemplate\"\n class=\"ion-padding\" disabled>\n <ion-skeleton-text [animated]=\"true\" style=\"width: 100%\"></ion-skeleton-text>\n </mat-option>\n </ng-template>\n\n <!-- Need more characters -->\n <ng-template #waitMoreCharacterTemplate>\n <mat-option class=\"ion-padding text-italic\" disabled>\n <ion-label>\n {{'INFO.PLEASE_TYPE_MORE_CHARACTERS'|translate:{minLength: suggestLengthThreshold} }}\n </ion-label>\n </mat-option>\n </ng-template>\n\n <!-- footer -->\n <ion-row *ngIf=\"itemCount; let count\" class=\"mat-autocomplete-footer ion-no-padding\">\n <ion-col>\n <ion-text class=\"ion-float-end ion-padding-end\"><i>{{'COMMON.RESULT_COUNT'|translate: {count: count} }}</i></ion-text>\n </ion-col>\n </ion-row>\n\n </mat-autocomplete>\n\n </ng-template>\n\n <div matSuffix>\n <ng-container *ngTemplateOutlet=\"matSuffixTemplate\"></ng-container>\n </div>\n\n <mat-error *ngIf=\"formControl.hasError('required')\" translate>ERROR.FIELD_REQUIRED</mat-error>\n <mat-error *ngIf=\"formControl.hasError('entity')\" translate>ERROR.FIELD_INVALID</mat-error>\n <ng-content select=\"[matError]\"></ng-content>\n\n </mat-form-field>\n </ng-template>\n </ion-col>\n <ion-col size=\"auto\" class=\"ion-align-self-center\">\n <ng-content select=\"[matAfter]\"></ng-content>\n </ion-col>\n </ion-row>\n</ion-grid>\n\n<ng-template #matPrefixTemplate>\n <ng-content select=\"[matPrefix]\"></ng-content>\n</ng-template>\n\n\n<ng-template #matSuffixTemplate>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"desktop\"\n (click)=\"dropButtonClick.emit($event)\"\n [hidden]=\"disabled\">\n <mat-icon class=\"large select-arrow\">arrow_drop_down</mat-icon>\n </button>\n <button matSuffix mat-icon-button tabindex=\"-1\"\n type=\"button\"\n *ngIf=\"clearable\"\n (click)=\"clearValue($event)\"\n [hidden]=\"disabled || !formControl.value\">\n <mat-icon>close</mat-icon>\n </button>\n\n <ng-content select=\"[matSuffix]\"></ng-content>\n</ng-template>\n\n<ng-template #headers>\n <ion-row class=\"mat-autocomplete-header ion-no-padding\">\n <ion-col *ngFor=\"let attr of displayAttributes; index as i\" [size]=\"displayColumnSizes[i]\">\n <ion-label [innerHTML]=\"displayColumnNames[i] | translate\"></ion-label>\n </ion-col>\n </ion-row>\n</ng-template>\n\n<ng-template #options>\n\n\n</ng-template>\n\n",
1782
1809
  providers: [{
1783
1810
  provide: NG_VALUE_ACCESSOR,
1784
1811
  multi: true,
@@ -4271,40 +4298,13 @@ SharedPipesModule.decorators = [
4271
4298
  },] }
4272
4299
  ];
4273
4300
 
4274
- /* ---
4275
- * Source: https://github.com/ionic-team/ionic-framework/blob/b0d53ca73619585671d8cf4dc24e47f826495a0a/core/src/utils/platform.ts
4276
- * --- */
4277
- const matchMedia = (win, query) => win.matchMedia(query).matches;
4278
- const testUserAgent = (win, expr) => {
4279
- const userAgent = win.navigator.userAgent || win.navigator.vendor || window.opera;
4280
- return expr.test(userAgent);
4281
- };
4282
- const isWindows = (win) => testUserAgent(win, /windows/i);
4283
- const isTouchUi = (win) => matchMedia(win, '(any-pointer:coarse)');
4284
- const isMobile = (win) => isTouchUi(win) && !isWindows(win);
4285
- const isIpad = (win) => {
4286
- // iOS 12 and below
4287
- if (testUserAgent(win, /iPad/i)) {
4288
- return true;
4289
- }
4290
- // iOS 13+
4291
- if (testUserAgent(win, /Macintosh/i) && isMobile(win)) {
4292
- return true;
4293
- }
4294
- return false;
4295
- };
4296
- const ɵ0$b = isIpad;
4297
- const isIOS = (win) => testUserAgent(win, /iPhone|iPod/i) || isIpad(win);
4298
- const isAndroid = (win) => testUserAgent(win, /android|sink/i);
4299
- const isCordova = (win) => !!(win['cordova'] || win['phonegap'] || win['PhoneGap']);
4300
-
4301
4301
  // Import the core angular services.
4302
4302
  // ----------------------------------------------------------------------------------- //
4303
4303
  // ----------------------------------------------------------------------------------- //
4304
4304
  const BASE_TIMER_DELAY = 100;
4305
4305
  class AutofocusDirective {
4306
4306
  // I initialize the autofocus directive.
4307
- constructor(elementRef, keyboard) {
4307
+ constructor(platform, elementRef, keyboard) {
4308
4308
  this.keyboard = keyboard;
4309
4309
  this._timer = null;
4310
4310
  this._elementRef = elementRef;
@@ -4379,6 +4379,7 @@ AutofocusDirective.decorators = [
4379
4379
  },] }
4380
4380
  ];
4381
4381
  AutofocusDirective.ctorParameters = () => [
4382
+ { type: Platform },
4382
4383
  { type: ElementRef },
4383
4384
  { type: Keyboard, decorators: [{ type: Optional }] }
4384
4385
  ];
@@ -4558,8 +4559,7 @@ const noop$7 = () => {
4558
4559
  };
4559
4560
  const ɵ0$a = noop$7;
4560
4561
  class MatLatLongField {
4561
- constructor(platform, translate, formBuilder, cd, formGroupDir) {
4562
- this.platform = platform;
4562
+ constructor(translate, formBuilder, cd, formGroupDir) {
4563
4563
  this.translate = translate;
4564
4564
  this.formBuilder = formBuilder;
4565
4565
  this.cd = cd;
@@ -4576,7 +4576,6 @@ class MatLatLongField {
4576
4576
  this.required = false;
4577
4577
  this.onBlur = new EventEmitter();
4578
4578
  this.onFocus = new EventEmitter();
4579
- this.mobile = this.platform.is('mobile');
4580
4579
  }
4581
4580
  get disabled() {
4582
4581
  return this.readonly || this.formControl.disabled;
@@ -4589,6 +4588,7 @@ class MatLatLongField {
4589
4588
  return this._readonly;
4590
4589
  }
4591
4590
  ngOnInit() {
4591
+ this.mobile = isNotNil(this.mobile) ? this.mobile : isMobile(window);
4592
4592
  this.type = this.type || 'latitude';
4593
4593
  this.pattern = this.pattern || 'DDMM';
4594
4594
  this.mask = MASKS[this.type] && MASKS[this.type][this.pattern];
@@ -4850,7 +4850,6 @@ MatLatLongField.decorators = [
4850
4850
  },] }
4851
4851
  ];
4852
4852
  MatLatLongField.ctorParameters = () => [
4853
- { type: Platform },
4854
4853
  { type: TranslateService },
4855
4854
  { type: FormBuilder },
4856
4855
  { type: ChangeDetectorRef },
@@ -4911,8 +4910,7 @@ const DAY_MASK$2 = [/\d/, /\d/, '/', /\d/, /\d/, '/', /\d/, /\d/, /\d/, /\d/];
4911
4910
  const noop$6 = () => { };
4912
4911
  const ɵ0$9 = noop$6;
4913
4912
  class MatDate {
4914
- constructor(platform, dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
4915
- this.platform = platform;
4913
+ constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
4916
4914
  this.dateAdapter = dateAdapter;
4917
4915
  this.translate = translate;
4918
4916
  this.formBuilder = formBuilder;
@@ -4955,11 +4953,12 @@ class MatDate {
4955
4953
  return this.formControl.value;
4956
4954
  }
4957
4955
  ngOnInit() {
4958
- this.mobile = isNil(this.mobile) ? this.platform.is('mobile') : this.mobile;
4959
- this._keyboardHideDelay = this.mobile && KEYBOARD_HIDE_DELAY_MS || 0;
4960
4956
  this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
4961
4957
  if (!this.formControl)
4962
4958
  throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-date-field>.');
4959
+ this.mobile = isNotNil(this.mobile) ? this.mobile : isMobile(window);
4960
+ // Workaround because ion-datetime has issue (do not returned a ISO date)
4961
+ this._keyboardHideDelay = this.mobile && KEYBOARD_HIDE_DELAY_MS || 0;
4963
4962
  this.required = toBoolean(this.required, this.formControl.validator === Validators.required);
4964
4963
  // Add 'validDate' validator (when existing validator are null or required, to be sure to keep it)
4965
4964
  if (!this.formControl.validator || this.formControl.validator === Validators.required) {
@@ -5219,7 +5218,6 @@ MatDate.decorators = [
5219
5218
  },] }
5220
5219
  ];
5221
5220
  MatDate.ctorParameters = () => [
5222
- { type: Platform },
5223
5221
  { type: DateAdapter },
5224
5222
  { type: TranslateService },
5225
5223
  { type: FormBuilder },
@@ -5228,12 +5226,12 @@ MatDate.ctorParameters = () => [
5228
5226
  { type: FormGroupDirective, decorators: [{ type: Optional }] }
5229
5227
  ];
5230
5228
  MatDate.propDecorators = {
5229
+ mobile: [{ type: Input }],
5231
5230
  formControl: [{ type: Input }],
5232
5231
  formControlName: [{ type: Input }],
5233
5232
  placeholder: [{ type: Input }],
5234
5233
  floatLabel: [{ type: Input }],
5235
5234
  required: [{ type: Input }],
5236
- mobile: [{ type: Input }],
5237
5235
  compact: [{ type: Input }],
5238
5236
  placeholderChar: [{ type: Input }],
5239
5237
  autofocus: [{ type: Input }],
@@ -5258,8 +5256,7 @@ const HOUR_MASK$1 = [/[012]/, /\d/, ':', /[012345]/, /\d/];
5258
5256
  const noop$5 = () => { };
5259
5257
  const ɵ0$8 = noop$5;
5260
5258
  class MatDateTime {
5261
- constructor(platform, dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5262
- this.platform = platform;
5259
+ constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5263
5260
  this.dateAdapter = dateAdapter;
5264
5261
  this.translate = translate;
5265
5262
  this.formBuilder = formBuilder;
@@ -5302,11 +5299,12 @@ class MatDateTime {
5302
5299
  return this.formControl.value;
5303
5300
  }
5304
5301
  ngOnInit() {
5305
- this.mobile = isNil(this.mobile) ? this.platform.is('mobile') : this.mobile;
5306
- this._keyboardHideDelay = this.mobile && KEYBOARD_HIDE_DELAY_MS || 0;
5307
5302
  this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
5308
5303
  if (!this.formControl)
5309
5304
  throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-date-time-field>.');
5305
+ this.mobile = isNotNil(this.mobile) ? this.mobile : isMobile(window);
5306
+ // Workaround because ion-datetime has issue (do not returned a ISO date)
5307
+ this._keyboardHideDelay = this.mobile && KEYBOARD_HIDE_DELAY_MS || 0;
5310
5308
  this.required = toBoolean(this.required, this.formControl.validator === Validators.required);
5311
5309
  // Add 'validDate' validator (when existing validator are null or required, to be sure to keep it)
5312
5310
  if (!this.formControl.validator || this.formControl.validator === Validators.required) {
@@ -5593,7 +5591,6 @@ MatDateTime.decorators = [
5593
5591
  },] }
5594
5592
  ];
5595
5593
  MatDateTime.ctorParameters = () => [
5596
- { type: Platform },
5597
5594
  { type: DateAdapter },
5598
5595
  { type: TranslateService },
5599
5596
  { type: FormBuilder },
@@ -5631,7 +5628,7 @@ const noop$4 = () => {
5631
5628
  };
5632
5629
  const ɵ0$7 = noop$4;
5633
5630
  class MatDateShort {
5634
- constructor(platform, dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5631
+ constructor(dateAdapter, translate, formBuilder, cd, keyboard, formGroupDir) {
5635
5632
  this.dateAdapter = dateAdapter;
5636
5633
  this.translate = translate;
5637
5634
  this.formBuilder = formBuilder;
@@ -5649,9 +5646,6 @@ class MatDateShort {
5649
5646
  this.compact = false;
5650
5647
  this.placeholderChar = DEFAULT_PLACEHOLDER_CHAR;
5651
5648
  this.clearable = false;
5652
- // Workaround because ion-datetime has issue (do not returned a ISO date)
5653
- this.mobile = platform.is('mobile');
5654
- this.keyboardHideDelay = this.mobile && KEYBOARD_HIDE_DELAY_MS || 0;
5655
5649
  this.locale = (translate.currentLang || translate.defaultLang).substr(0, 2);
5656
5650
  }
5657
5651
  set tabindex(value) {
@@ -5670,6 +5664,9 @@ class MatDateShort {
5670
5664
  this.formControl = this.formControl || this.formControlName && this.formGroupDir && this.formGroupDir.form.get(this.formControlName);
5671
5665
  if (!this.formControl)
5672
5666
  throw new Error('Missing mandatory attribute \'formControl\' or \'formControlName\' in <mat-date-short-field>.');
5667
+ this.mobile = isNotNil(this.mobile) ? this.mobile : isMobile(window);
5668
+ // Workaround because ion-datetime has issue (do not returned a ISO date)
5669
+ this.keyboardHideDelay = this.mobile && KEYBOARD_HIDE_DELAY_MS || 0;
5673
5670
  // Redirect errors from main control, into day sub control
5674
5671
  const $error = new BehaviorSubject(null);
5675
5672
  this.required = toBoolean(this.required, this.formControl.validator === Validators.required);
@@ -5894,7 +5891,6 @@ MatDateShort.decorators = [
5894
5891
  },] }
5895
5892
  ];
5896
5893
  MatDateShort.ctorParameters = () => [
5897
- { type: Platform },
5898
5894
  { type: DateAdapter },
5899
5895
  { type: TranslateService },
5900
5896
  { type: FormBuilder },
@@ -5903,6 +5899,7 @@ MatDateShort.ctorParameters = () => [
5903
5899
  { type: FormGroupDirective, decorators: [{ type: Optional }] }
5904
5900
  ];
5905
5901
  MatDateShort.propDecorators = {
5902
+ mobile: [{ type: Input }],
5906
5903
  disabled: [{ type: Input }],
5907
5904
  formControl: [{ type: Input }],
5908
5905
  formControlName: [{ type: Input }],
@@ -9037,11 +9034,12 @@ HotkeysDialogComponent.ctorParameters = () => [
9037
9034
  ];
9038
9035
 
9039
9036
  class Hotkeys {
9040
- constructor(eventManager, dialog, document, modalController) {
9037
+ constructor(eventManager, dialog, document, modalController, popoverController) {
9041
9038
  this.eventManager = eventManager;
9042
9039
  this.dialog = dialog;
9043
9040
  this.document = document;
9044
9041
  this.modalController = modalController;
9042
+ this.popoverController = popoverController;
9045
9043
  this._debug = false;
9046
9044
  this._hotkeys = new Map();
9047
9045
  this._defaults = {
@@ -9070,10 +9068,12 @@ class Hotkeys {
9070
9068
  return new Observable(observer => {
9071
9069
  const handler = (e) => __awaiter(this, void 0, void 0, function* () {
9072
9070
  // Get top component from ModalController
9073
- const top = yield this.modalController.getTop();
9071
+ const top = (yield this.modalController.getTop()) || (yield this.popoverController.getTop());
9074
9072
  // If modal present, check its component name against hotkey element name (fix #181)
9075
- if (top && top.component['name'] !== merged.elementName)
9073
+ if (top && top.component['name'] !== merged.elementName) {
9074
+ e.preventDefault();
9076
9075
  return;
9076
+ }
9077
9077
  if (e instanceof KeyboardEvent && e.repeat)
9078
9078
  return; // skip when repeated
9079
9079
  if (merged.preventDefault)
@@ -9096,7 +9096,7 @@ class Hotkeys {
9096
9096
  });
9097
9097
  }
9098
9098
  }
9099
- Hotkeys.ɵprov = i0.ɵɵdefineInjectable({ factory: function Hotkeys_Factory() { return new Hotkeys(i0.ɵɵinject(i1$5.EventManager), i0.ɵɵinject(i2$1.MatDialog), i0.ɵɵinject(i1$3.DOCUMENT), i0.ɵɵinject(i1$4.ModalController)); }, token: Hotkeys, providedIn: "root" });
9099
+ Hotkeys.ɵprov = i0.ɵɵdefineInjectable({ factory: function Hotkeys_Factory() { return new Hotkeys(i0.ɵɵinject(i1$5.EventManager), i0.ɵɵinject(i2$1.MatDialog), i0.ɵɵinject(i1$3.DOCUMENT), i0.ɵɵinject(i1$4.ModalController), i0.ɵɵinject(i1$4.PopoverController)); }, token: Hotkeys, providedIn: "root" });
9100
9100
  Hotkeys.decorators = [
9101
9101
  { type: Injectable, args: [{
9102
9102
  providedIn: 'root'
@@ -9106,7 +9106,8 @@ Hotkeys.ctorParameters = () => [
9106
9106
  { type: EventManager },
9107
9107
  { type: MatDialog },
9108
9108
  { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT,] }] },
9109
- { type: ModalController }
9109
+ { type: ModalController },
9110
+ { type: PopoverController }
9110
9111
  ];
9111
9112
 
9112
9113
  class SharedHotkeysModule {
@@ -10468,7 +10469,7 @@ class LocalSettingsService extends StartableService {
10468
10469
  ngOnStart() {
10469
10470
  console.info('[settings] Starting service...');
10470
10471
  // Restoring local settings
10471
- this._data.mobile = isNotNil(this._data.mobile) ? this._data.mobile : isMobile(window);
10472
+ this._data.mobile = isNotNil(this._data.mobile) ? this._data.mobile : (isCordova(window) || isMobile(window));
10472
10473
  this._data.usageMode = (isAndroid(window) || isIOS(window)) ? 'FIELD' : 'DESK'; // FIELD by default if Android or iOS
10473
10474
  // Restoring local settings
10474
10475
  return this.restoreLocally();
@@ -13448,7 +13449,7 @@ class GraphqlService extends StartableService {
13448
13449
  return __awaiter(this, void 0, void 0, function* () {
13449
13450
  yield this.network.ready();
13450
13451
  console.info('[graphql] Starting graphql...');
13451
- const mobile = this.platform.is('mobile') || this.platform.is('mobileweb');
13452
+ const mobile = isMobile(window);
13452
13453
  const enableTrackMutationQueries = !mobile;
13453
13454
  const peer = this.network.peer;
13454
13455
  if (!peer)
@@ -15562,7 +15563,7 @@ class ConfigService extends BaseGraphqlService {
15562
15563
  else {
15563
15564
  let now = this._debug && Date.now();
15564
15565
  // Convert images, for offline usage
15565
- if (this.network.online && this.platform.is('mobile')) {
15566
+ if (this.network.online && isMobile(window)) {
15566
15567
  const jobs = [];
15567
15568
  // Download logos
15568
15569
  if (data.largeLogo && data.largeLogo.startsWith('http')) {
@@ -15689,14 +15690,15 @@ class PlatformService extends StartableService {
15689
15690
  is(platformName) {
15690
15691
  switch (platformName) {
15691
15692
  case 'mobile':
15692
- // Use custom mobile detection - see SUMARIS issue #323
15693
- return isMobile(window);
15693
+ case 'mobileweb':
15694
+ // Exclude Windows touch screens - see SUMARIS issue #323
15695
+ return this.platform.is(platformName) && !isWindows(window);
15694
15696
  default:
15695
15697
  return this.platform.is(platformName);
15696
15698
  }
15697
15699
  }
15698
15700
  get mobile() {
15699
- return isNotNil(this._mobile) ? this._mobile : isMobile(window);
15701
+ return isNotNil(this._mobile) ? this._mobile : this.is('mobile');
15700
15702
  }
15701
15703
  /**
15702
15704
  * Say if opened has been opened inside an Android or iOs App.
@@ -15711,17 +15713,17 @@ class PlatformService extends StartableService {
15711
15713
  isIOSCordova() {
15712
15714
  return this._ios && this._cordova || false;
15713
15715
  }
15714
- isWeb() {
15715
- return !this._cordova || (!this._android && !this._ios);
15716
- }
15717
15716
  isApp() {
15718
- return this._cordova && (this._android || this._ios);
15717
+ return this.isAndroidCordova() || this.isIOSCordova();
15718
+ }
15719
+ isWeb() {
15720
+ return !this.isApp();
15719
15721
  }
15720
15722
  isMobileWeb() {
15721
- return isMobile(window) && this.isWeb();
15723
+ return this.mobile && this.isWeb();
15722
15724
  }
15723
15725
  get canDownload() {
15724
- return !!this.downloader && this.isAndroidCordova();
15726
+ return this.downloader && this.isAndroidCordova();
15725
15727
  }
15726
15728
  get canOpenFile() {
15727
15729
  return false;
@@ -26101,8 +26103,7 @@ class DateTimeTestPage {
26101
26103
  disableControl.disable();
26102
26104
  // Copy the 'enable' value, into the disable control
26103
26105
  this.form.get('enable').valueChanges.subscribe(value => disableControl.setValue(value));
26104
- const mobile = platform.is('mobile');
26105
- this.showLogPanel = this.showLogPanel || mobile;
26106
+ this.showLogPanel = this.showLogPanel || isMobile(window);
26106
26107
  }
26107
26108
  ngOnInit() {
26108
26109
  setTimeout(() => this.loadData(), 250);
@@ -26356,8 +26357,7 @@ NumpadTestPage.ctorParameters = () => [
26356
26357
 
26357
26358
  const moment = momentImported;
26358
26359
  class DateTestPage {
26359
- constructor(platform, formBuilder, cd) {
26360
- this.platform = platform;
26360
+ constructor(formBuilder, cd) {
26361
26361
  this.formBuilder = formBuilder;
26362
26362
  this.cd = cd;
26363
26363
  this.showLogPanel = true;
@@ -26379,8 +26379,7 @@ class DateTestPage {
26379
26379
  disableControl.disable();
26380
26380
  // Copy the 'enable' value, into the disable control
26381
26381
  this.form.get('enable').valueChanges.subscribe(value => disableControl.setValue(value));
26382
- const mobile = platform.is('mobile');
26383
- this.showLogPanel = this.showLogPanel || mobile;
26382
+ this.showLogPanel = this.showLogPanel || isMobile(window);
26384
26383
  }
26385
26384
  ngOnInit() {
26386
26385
  setTimeout(() => this.loadData(), 250);
@@ -26449,7 +26448,6 @@ DateTestPage.decorators = [
26449
26448
  },] }
26450
26449
  ];
26451
26450
  DateTestPage.ctorParameters = () => [
26452
- { type: Platform },
26453
26451
  { type: FormBuilder },
26454
26452
  { type: ChangeDetectorRef }
26455
26453
  ];
@@ -27134,5 +27132,5 @@ CoreTestingModule.decorators = [
27134
27132
  * Generated bundle index. Do not edit.
27135
27133
  */
27136
27134
 
27137
- export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuService, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UserEvent, UserEventFilter, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, isControlHasInput, isCordova, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindows, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForTrue, waitIdle, waitWhilePending, ɵ0$b as ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, isFocusableElement as ɵc, RegisterForm as ɵd, AccountValidatorService as ɵe, RegisterModal as ɵf, UserSettingsValidatorService as ɵg, LocalSettingsValidatorService as ɵh, AppIconComponent as ɵi, DateTestPage as ɵj, NumpadTestPage as ɵk, MatBadgeIconTestPage as ɵl, ToastTestingModule as ɵm, ToastTestingPage as ɵn };
27135
+ export { APP_ABOUT_DEVELOPERS, APP_ABOUT_PARTNERS, APP_CONFIG_OPTIONS, APP_FORM_ERROR_I18N_KEYS, APP_GRAPHQL_TYPE_POLICIES, APP_HOME_BUTTONS, APP_LOCALES, APP_LOCAL_SETTINGS, APP_LOCAL_SETTINGS_OPTIONS, APP_LOCAL_STORAGE_TYPE_POLICIES, APP_MENU_ITEMS, APP_TESTING_PAGES, AboutModal, Account, AccountPage, AccountService, AccountToStringPipe, ActionsColumnComponent, AdminModule, AdminRoutingModule, Alerts, AndroidOsEnvironment, AnimationState, AppEditor, AppEditorOptions, AppEntityEditor, AppForm, AppFormField, AppFormProvider, AppFormUtils, AppGestureConfig, AppGraphQLModule, AppHelpModal, AppInMemoryTable, AppInstallUpgradeCard, AppListForm, AppLoadingSpinner, AppMenuModule, AppNullForm, AppPropertiesForm, AppTabEditor, AppTabEditorOptions, AppTable, AppTableDataSourceOptions, AppTableUtils, AppValidatorService, AppendToInputDirective, ArrayFilterPipe, ArrayFirstPipe, ArrayIncludesPipe, ArrayLengthPipe, ArrayPluckPipe, AudioProvider, AuthForm, AuthGuardService, AuthModal, AutocompleteTestPage, AutofocusDirective, Base58, BaseEntityService, BaseGraphqlService, BaseGraphqlServiceOptions, BaseReferential, Beans, CORE_CONFIG_OPTIONS, CORE_TESTING_PAGES, CellValueChangeListener, ChipsTestPage, Color, ColorScale, ComponentDirtyGuard, ConfigService, Configuration, CoreModule, CoreTestingModule, CryptoService, DATE_ISO_PATTERN, DATE_UNIX_MS_TIMESTAMP, DATE_UNIX_TIMESTAMP, DEFAULT_PAGE_SIZE, DEFAULT_PAGE_SIZE_OPTIONS, DEFAULT_PLACEHOLDER_CHAR, DEFAULT_REQUIRED_COLUMNS, DateDiffDurationPipe, DateFormatPipe, DateFromNowPipe, DateTimeTestPage, DateUtils, Department, DepartmentToStringPipe, DragAndDropDirective, DurationPipe, ENTITIES_STORAGE_KEY_PREFIX, ENVIRONMENT, EmptyArrayPipe, EntitiesService, EntitiesStorage, EntitiesTableDataSource, Entity, EntityClass, EntityClasses, EntityFilter, EntityFilterUtils, EntityMetadataComponent, EntityStore, EntityUtils, Environment, ErrorCodes, EvenPipe, FileResponse, FileService, FileSizePipe, FilesUtils, FormArrayHelper, FormButtonsBarComponent, FormButtonsBarToken, FormErrorTranslatePipe, FormErrorTranslator, FormFieldValuesHolder, FormGetArrayPipe, FormGetControlPipe, FormGetGroupPipe, FormGetPipe, Fragments, GraphqlService, HAMMER_PRESS_TIME, HAMMER_TAP_TIME, HighlightPipe, HomePage, Hotkeys, HotkeysDialogComponent, InMemoryEntitiesService, IsLoginAccountPipe, IsNilOrBlankPipe, IsNotNilOrBlankPipe, IsNotOnFieldModePipe, IsOnFieldModePipe, JobUtils, KEYBOARD_HIDE_DELAY_MS, LAT_LONG_DEFAULT_MAX_DECIMALS, LAT_LONG_PATTERNS, LatLongFormatPipe, LatLongTestPage, LatitudeFormatPipe, LocalSettingsService, LongitudeFormatPipe, MINIFY_ENTITY_FOR_LOCAL_STORAGE, MINIFY_ENTITY_FOR_POD, MapGetPipe, MapKeysPipe, MapValuesPipe, MatAutocompleteConfigHolder, MatAutocompleteField, MatBadgeIconDirective, MatBooleanField, MatChipsField, MatDate, MatDateShort, MatDateTime, MatDuration, MatLatLongField, MatNumpadComponent, MatNumpadContainerComponent, MatNumpadContent, MatPaginatorI18n, MatStepperI18n, MatSwipeField, MaterialTestingModule, MathAbsPipe, MenuComponent, MenuItems, MenuService, ModalToolbarComponent, NetworkService, NgInitDirective, NgVarDirective, NotEmptyArrayPipe, NumberFormatPipe, NumpadDirective, OddPipe, PRIORITIZED_AUTHORITIES, PUBKEY_REGEXP, Peer, Person, PersonFilter, PersonFragments, PersonService, PersonToStringPipe, PersonUtils, PersonValidatorService, PlatformService, ProgressBarService, ProgressInterceptor, PropertyGetPipe, RESERVED_END_COLUMNS, RESERVED_START_COLUMNS, Referential, ReferentialFilter, ReferentialRef, ReferentialUtils, ReferentialValidatorService, RegisterConfirmPage, SETTINGS_DISPLAY_COLUMNS, SETTINGS_FILTER, SETTINGS_PAGE_SIZE, SETTINGS_SORTED_COLUMN, SETTINGS_STORAGE_KEY, SETTINGS_TRANSIENT_PROPERTIES, SHARED_MATERIAL_TESTING_PAGES, SHARED_TESTING_PAGES, SPACE_PLACEHOLDER_CHAR, SelectPeerModal, SettingsPage, SharedAsyncValidators, SharedDirectivesModule, SharedFormArrayValidators, SharedFormGroupValidators, SharedHotkeysModule, SharedMatAutocompleteModule, SharedMatBadgeIconModule, SharedMatBooleanModule, SharedMatChipsModule, SharedMatDateTimeModule, SharedMatDurationModule, SharedMatLatLongModule, SharedMatNumpadModule, SharedMatSwipeModule, SharedMaterialModule, SharedModule, SharedPipesModule, SharedRoutingModule, SharedTestingModule, SharedTestsPage, SharedValidators, SocialModule, Software, StartableService, StatusById, StatusIds, StatusList, StrIncludesPipe, StrLengthPipe, SwipeTestPage, TableSelectColumnsComponent, TableTestPage, TableTestingModule, TextForm, TextPopover, TextPopoverTestingModule, TextPopoverTestingPage, ToStringPipe, Toasts, ToolbarComponent, ToolbarToken, TranslatablePipe, TranslateContextPipe, TranslateContextService, UploadFile, UploadFileComponent, UploadFilePopover, UploadFileTestingModule, UploadFileTestingPage, UserEvent, UserEventFilter, UserEventService, UserEventTypes, UserEventsTable, UserSettings, UsersPage, accountToString, adaptValueToControl, addValueInArray, arrayDistinct, arrayGroupBy, arraySize, asInputElement, canHaveFocus, capitalizeFirstLetter, chainPromises, changeCaseToUnderscore, clearValueInArray, copyEntity2Form, createPromiseEvent, createPromiseEventEmitter, departmentToString, departmentsToString, disableControls, emitPromiseEvent, entityToString, equals, equalsOrNil, fadeInAnimation, fadeInOutAnimation, filterFalse, filterNotNil, filterNumberInput, filterTrue, firstArrayValue, firstFalse, firstFalsePromise, firstNotNil, firstNotNilPromise, firstTrue, firstTruePromise, focusInput, focusNextInput, focusPreviousInput, formatLatitude, formatLongitude, fromDateISOString, fromScrollEndEvent, fromUnixMsTimestamp, fromUnixTimestamp, getCaretPosition, getColorContrast, getColorShade, getColorTint, getConnectionType, getControlFromPath, getFocusableInputElements, getFormErrors, getFormValueFromEntity, getProperty, getPropertyByPath, getPropertyByPathAsString, getRandomImage, hexToRgb, hexToRgbArray, isAndroid, isControlHasInput, isCordova, isEmptyArray, isIOS, isInputElement, isInstanceOf, isInt, isMobile, isNil, isNilOrBlank, isNilOrNaN, isNotEmptyArray, isNotNil, isNotNilOrBlank, isNotNilOrNaN, isNotNilString, isNumber, isNumberRange, isProgressEvent, isResponseEvent, isTouchUi, isWindows, joinProperties, joinPropertiesPath, logFormErrors, markAllAsTouched, markAsUntouched, markControlAsTouched, markFormGroupAsTouched, matchMedia, matchUpperCase, mergeLoadResult, mixHex, moveInputCaretToSeparator, noTrailingSlash, notNilOrDefault, nullIfUndefined, parseLatitudeOrLongitude, propertiesPathComparator, propertyComparator, propertyPathComparator, referentialToString, referentialsToString, remove, removeAll, removeDiacritics, removeDuplicatesFromArray, removeEnd, removeValueInArray, replaceAll, resetCalculatedValue, resizeArray, rgbArrayToHex, rgbToHex, round, scrollFactory, selectInputContent, selectInputRange, setCalculatedValue, setTabIndex, sleep, slideInOutAnimation, slideUpDownAnimation, sort, splitById, splitByProperty, startsWithUpperCase, suggestFromArray, suggestFromStringArray, tabindexComparator, testUserAgent, toBoolean, toDateISOString, toDuration, toFloat, toInt, toNotNil, toNumber, trimEmptyToNull, uncapitalizeFirstLetter, updateValueAndValidity, waitFor, waitForTrue, waitIdle, waitWhilePending, ɵ0$c as ɵ0, CustomReuseStrategy as ɵa, MatNumpadDomService as ɵb, isFocusableElement as ɵc, RegisterForm as ɵd, AccountValidatorService as ɵe, RegisterModal as ɵf, UserSettingsValidatorService as ɵg, LocalSettingsValidatorService as ɵh, AppIconComponent as ɵi, DateTestPage as ɵj, NumpadTestPage as ɵk, MatBadgeIconTestPage as ɵl, ToastTestingModule as ɵm, ToastTestingPage as ɵn };
27138
27136
  //# sourceMappingURL=sumaris-net.ngx-components.js.map