diff --git a/clusters/base/apps/davical/helmrelease-davical.yaml b/clusters/base/apps/davical/helmrelease-davical.yaml index 88f01ea..1146429 100644 --- a/clusters/base/apps/davical/helmrelease-davical.yaml +++ b/clusters/base/apps/davical/helmrelease-davical.yaml @@ -90,6 +90,11 @@ spec: # No stripPrefix middleware either: Apache needs to see the /server # prefix itself (via the Alias added in the seed-config initContainer) # so that DAViCal's self-referential links come out correct. + # + # c2.aggtaa.com/server is the same backend, reachable same-origin + # from InfCloud (also on c2.aggtaa.com) so its browser-side CalDAV + # requests don't need CORS. That ingress owns the cert-manager + # annotation for c2.aggtaa.com; this one just reuses its secret. hosts: - host: c.aggtaa.com paths: @@ -98,10 +103,20 @@ spec: service: identifier: app port: http + - host: c2.aggtaa.com + paths: + - path: /server + pathType: Prefix + service: + identifier: app + port: http tls: - secretName: radicale-tls hosts: - c.aggtaa.com + - secretName: infcloud-tls + hosts: + - c2.aggtaa.com persistence: config: diff --git a/clusters/base/apps/infcloud/configmap.yaml b/clusters/base/apps/infcloud/configmap.yaml new file mode 100644 index 0000000..c73d0bb --- /dev/null +++ b/clusters/base/apps/infcloud/configmap.yaml @@ -0,0 +1,1449 @@ +apiVersion: v1 +kind: ConfigMap +metadata: + name: infcloud-config + namespace: pim +data: + # upstream default config.js (https://inf-it.com/infcloud/config.js.txt), + # only the CalDAV href (points at davical, same-origin via /server to + # avoid CORS) and the default timezone were changed from stock. + config.js: | + /* + InfCloud - the open source CalDAV/CardDAV Web Client + Copyright (C) 2011-2015 + Jan Mate + Andrej Lezo + Matej Mihalik + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + */ + + + // NOTE: see readme.txt before you start to configure this client! + + + // NOTE: do not forget to execute the cache_update.sh script every time you + // update this configuration file or any other files (otherwise your browser + // will use the previous version of files stored in HTML5 cache). Alternatively + // you can update the cache.manifest manually - edit the second line beginning + // with "#V 20" to anything else (this file simple needs "some" change) + + + // Supported setup types (use ONE of them): + // a.) globalAccountSettings => username and password is hardcoded + // in config.js, automatic login without the login screen + // - advantages: fast login process = no username/password is required + // - disadvantages: username/password is visible in your config.js, so + // this type of setup is recommended ONLY for intranet/home users + // b.) globalNetworkCheckSettings => standard setup with login screen + // - advantages: username/password is required (no visible + // username/password in config.js) + // - disadvantages: if a user enters wrong username/password then + // the browser will show authentication popup window (it is NOT + // possible to disable it in JavaScript; see the next option) + // c.) globalNetworkAccountSettings => advanced setup with login screen + // - advantages: no authentication popup if you enter wrong username/ + // password, dynamic XML configuration generator (you can generate + // different configurations for your users /by modifying the "auth" + // module configuration or the PHP code itself/) + // - disadvantages: requires PHP >= 5.3 and additional configuration, + // only basic http authentication is supported => always use https! + // + // + // What is a "principal URL"? => Check you server documentation! + // - "principal URL" is NOT "collection URL" + // - this client automatically detects collections for "principal URL" + // - PROPER "principal URL" looks like: + // https://server.com:8443/principals/users/USER/ + // https://server.com:8443/caldav.php/USER/ + // - INVALID principal URL looks like: + // https://server.com:8443/principals/users/USER/collection/ + // => this is a collection URL + // https://server.com:8443/caldav.php/USER/collection/ + // => this is a collection URL + // https://server.com:8443/principals/users/USER + // => missing trailing '/' + // https://server.com:8443/caldav.php/USER + // => missing trailing '/' + // /caldav.php/USER/ + // => relative URL instead of full URL + // + // + // List of properties used in globalAccountSettings, globalNetworkCheckSettings + // and globalNetworkAccountSettings variables (+ in the "auth" module): + // - href + // Depending on the setup type set the value to: + // a.) globalAccountSettings: full "principal URL" + // b.) globalNetworkCheckSettings: "principal URL" WITHOUT the "USER/" part + // c.) globalNetworkAccountSettings: "full URL" to the "auth" directory + // This property is supported in: + // globalAccountSettings + // globalNetworkCheckSettings + // globalNetworkAccountSettings + // - userAuth + // - userName + // Set the username you want to login. + // - userPassword + // Set the password for the given username. + // This property is supported in: + // globalAccountSettings + // - timeOut + // This option sets the timeout for jQuery .ajax call (in miliseconds). + // Example: + // timeOut: 90000 + // This property is supported in: + // globalAccountSettings + // globalNetworkCheckSettings + // globalNetworkAccountSettings + // - lockTimeOut + // NOTE: used only if server supports LOCK requests + // This option sets the LOCK timeout value if resource locking + // is used (in miliseconds). + // Example: + // lockTimeOut: 10000 + // This property is supported in: + // globalAccountSettings + // globalNetworkCheckSettings + // globalNetworkAccountSettings (available in auth module only) + // - checkContentType + // This option enables a content-type checking for server response. + // If enabled then only objects with proper content-type are inserted + // into the interface. + // If you cannot see data in the interface you may try to disable it (useful + // if your server returns wrong value in "propstat/prop/getcontenttype"). + // If undefined then content-type checking is enabled. + // Examples: + // checkContentType: true + // checkContentType: false + // This property is supported in: + // globalAccountSettings + // globalNetworkCheckSettings + // globalNetworkAccountSettings (available in auth module only) + // - settingsAccount + // NOTE: server support for custom DAV properties is REQUIRED! + // This option sets the account where the client properties such as: + // loaded collections, enabled collections, ... are saved during + // the logout and resource/collection synchronisation + // NOTE: set it to true ONLY for ONE account! + // Examples: + // settingsAccount: true + // settingsAccount: false + // This property is supported in: + // globalAccountSettings + // globalNetworkCheckSettings + // globalNetworkAccountSettings (available in auth module only) + // - delegation + // NOTE: server support for this functionality is REQUIRED! + // This option allows you to load delegated (shared) collections. + // If set to true (default) then delegation functionality is enabled, + // and the interface allows you to load delegated collections. + // If false then delegation functionality is completely disabled. + // Examples: + // delegation: true + // delegation: false + // This property is supported in: + // globalAccountSettings + // globalNetworkCheckSettings + // globalNetworkAccountSettings (available in auth module only) + // - additionalResources + // This options sets the list of additional resources (e.g. shared resources + // accessible by all users). If the server supports delegation (see + // the delegation option above) there is no reason to use this option! + // Supported values: + // - array of URL encoded resource names (not collections), such as: + // 'company' + // 'shared_resource' + // If empty (default) or undefined then shared resources are not loaded + // using this option, but may be loaded using the delegation option. + // Examples: + // additionalResources=[] + // additionalResources=['public', 'shared_resource'] + // This property is supported in: + // globalNetworkCheckSettings + // - hrefLabel + // This option sets the server name in the resource header (useful if + // you want to see custom resource header above the collections). + // You can use the following variables in the value: + // %H = full hostname (including the port number) + // %h = full hostname (without the port number) + // %D = full domain name + // %d = only the first and second level domain + // %P = principal name + // %p = principal name without the @domain.com part (if present) + // %U = logged user name + // %u = logged user name without the @domain.com part (if present) + // If undefined, empty or or null then '%d/%p [%u]' is used. + // Examples: + // hrefLabel: '%d/%p [%u]' + // hrefLabel: '%D/%u' + // This property is supported in: + // globalAccountSettings + // globalNetworkCheckSettings + // globalNetworkAccountSettings (available in auth module only) + // - forceReadOnly + // This option sets the list of collections as "read-only". + // Supported values: + // - true + // all collections will be "read-only" + // - array of URL encoded + // - collections, such as: + // '/caldav.php/user/calendar/' + // '/caldav.php/user%40domain.com/calendar/' + // - regexes, such as: + // new RegExp('^/caldav.php/user/calendar[0-9]/$', 'i') + // specifies the list of collections marked as "read-only" + // If null (default) or undefined then server detected privileges are used. + // Examples: + // forceReadOnly: null + // forceReadOnly: true + // forceReadOnly: ['/caldav.php/user/calendar/', + // '/caldav.php/user/calendar2/'] + // forceReadOnly: [new RegExp('^/.*/user/calendar[0-9]/$', 'i')] + // This property is supported in: + // globalAccountSettings + // globalNetworkCheckSettings + // globalNetworkAccountSettings (available in auth module only, with + // different syntax for regexes) + // - ignoreAlarms + // This option sets list of calendar collections with disabled + // alarm functionality. + // Supported values: + // - true + // alarm functionality is disabled for all collections + // - array of URL encoded + // - collections, such as: + // '/caldav.php/user/calendar/' + // '/caldav.php/user%40domain.com/calendar/' + // - regexes, such as: + // new RegExp('^/caldav.php/user/calendar[0-9]/$', 'i') + // specifies the list of collections with disabled alarm functionality. + // If false (default) or undefined then alarm functionality is enabled + // for all collections. + // Examples: + // ignoreAlarms: true + // ignoreAlarms: ['/caldav.php/user/calendar/', + // '/caldav.php/user/calendar2/'] + // ignoreAlarms: [new RegExp('^/.*/user/calendar[0-9]/$', 'i')] + // This property is supported in: + // globalAccountSettings + // globalNetworkCheckSettings + // globalNetworkAccountSettings (available in auth module only, with + // different syntax for regexes) + // - backgroundCalendars + // This options defines a list of background calendars. If there is + // at least one event defined for the given day in a background calendar, + // the background color for that day will be pink/light-red. + // Supported values: + // - array of URL encoded + // - collections, such as: + // '/caldav.php/user/calendar/' + // '/caldav.php/user%40domain.com/calendar/' + // - regexes, such as: + // new RegExp('^/caldav.php/user/calendar[0-9]/$', 'i') + // specifies the list of background calendar collections. + // Examples: + // backgroundCalendars: ['/caldav.php/user/calendar/', + // '/caldav.php/user/calendar2/'] + // backgroundCalendars: [new RegExp('^/.*/user/calendar[0-9]/$', 'i')] + // This property is supported in: + // globalAccountSettings + // globalNetworkCheckSettings + // globalNetworkAccountSettings (available in auth module only, with + // different syntax for regexes) + // Special options not present in configuration examples: + // NOTE: use ONLY if you know what are you doing! + // - crossDomain + // This option sets the crossDomain for jQuery .ajax call. If null (default) + // then the value is autodetected /and the result is shown in the console/ + // - withCredentials + // This option sets the withCredentials for jQuery .ajax call. The default + // value is false and there is NO REASON to change it to true! + // NOTE: if true, Access-Control-Allow-Origin "*" (CORS header) not works! + + + // globalAccountSettings + // Use this option if you want to use automatic login (without a login + // screen) with hardcoded username/password in config.js. Otherwise use + // globalNetworkCheckSettings or globalNetworkAccountSettings (see below). + // NOTE: if this option is used the value must be an array of object(s). + // List of properties used in globalAccountSettings variable: + // - href + // Set this option to the full "principal URL". + // NOTE: the last character in the value must be '/' + // - userAuth + // - userName + // Set the username you want to login. + // - userPassword + // Set the password for the given username. + // NOTE: for description of other properties see comments at the beginning + // of this file. + // NOTE: for minimal/fast setup you need to set only the href and userAuth + // options. It is safe/recommended to keep the remaining options unchanged! + // Example: + //var globalAccountSettings=[ + // { + // href: 'https://server1.com:8443/caldav.php/USERNAME1/', + // userAuth: + // { + // userName: 'USERNAME1', + // userPassword: 'PASSWORD1' + // }, + // timeOut: 90000, + // lockTimeOut: 10000, + // checkContentType: true, + // settingsAccount: true, + // delegation: true, + // hrefLabel: null, + // forceReadOnly: null, + // ignoreAlarms: false, + // backgroundCalendars: [] + // }, + // { + // href: 'https://server2.com:8443/caldav.php/USERNAME2/', + // ... + // ... + // } + //]; + + + // globalNetworkCheckSettings + // Use this option if you want to use standard login screen without + // hardcoded username/password in config.js (used by globalAccountSettings). + // NOTE: if this option is used the value must be an object. + // List of properties used in globalAccountSettings variable: + // - href + // Set this option to the "principal URL" WITHOUT the "USERNAME/" + // part (this options uses the username from the login screen). + // NOTE: the last character in the value must be '/' + // NOTE: for description of other properties see comments at the beginning + // of this file. + // NOTE: for minimal/fast setup you need to set only the href option. It is + // safe/recommended to keep the remaining options unchanged! + // Example href values: + // OS X server http example (see misc/readme_osx.txt for server setup): + // href: 'http://osx.server.com:8008/principals/users/' + // OS X server https example (see misc/readme_osx.txt for server setup): + // href: 'https://osx.server.com:8443/principals/users/' + // Cyrus server https example: + // href: 'https://cyrus.server.com/dav/principals/user/' + // Example: + // Davical example which automatically detects the protocol, server name, + // port, ... (client installed into Davical "htdocs" subdirectory; + // works "out of the box", no additional setup required): + var globalNetworkCheckSettings={ + href: location.protocol+'//'+location.hostname+ + (location.port ? ':'+location.port: '')+ + '/server/caldav.php/', + timeOut: 90000, + lockTimeOut: 10000, + checkContentType: true, + settingsAccount: true, + delegation: true, + additionalResources: [], + hrefLabel: null, + forceReadOnly: null, + ignoreAlarms: false, + backgroundCalendars: [] + } + + + // globalNetworkAccountSettings + // Try this option ONLY if you have working setup using + // globalNetworkCheckSettings and want to fix the authentication popup + // window problem (if invalid username/password is entered)! + // If you use this option then your browser sends username/password to the PHP + // "auth" module ("auth" directory) instead of the DAV server itself. + // The "auth" module then validates your username/password against your server, + // and if the authentication is successful, then it sends back a configuration + // XML (requires additional configuration). The resulting XML is handled + // IDENTICALLY as the globalAccountSettings configuration option. + // NOTE: for the "auth" module configuration see readme.txt! + // NOTE: this option invokes a login screen and disallows access until + // the client gets correct XML configuration file from the server! + // List of properties used in globalNetworkAccountSettings variable: + // - href + // Set this option to the "full URL" of the "auth" directory + // NOTE: the last character in the value must be '/' + // NOTE: for description of other properties see comments at the beginning + // of this file. + // Example href values: + // href: 'https://server.com/client/auth/' + // Example: + // Use this configuration if the "auth" module is located in the client + // installation subdirectory (default): + //var globalNetworkAccountSettings={ + // href: location.protocol+'//'+location.hostname+ + // (location.port ? ':'+location.port : '')+ + // location.pathname.replace(RegExp('index\.html$'),'')+ + // 'auth/', + // timeOut: 30000 + //}; + + + // globalUseJqueryAuth + // Use jQuery .ajax() auth or custom header for HTTP basic auth (default). + // Set this option to true if your server uses digest auth (note: you may + // experience auth popups on some browsers). + // If undefined (or empty), custom header for HTTP basic auth is used. + // Example: + //var globalUseJqueryAuth=false; + + + // globalBackgroundSync + // Enable background synchronization even if the browser window/tab has no + // focus. + // If false, synchronization is performed only if the browser window/tab + // is focused. If undefined or not false, then background sync is enabled. + // Example: + var globalBackgroundSync=true; + + + // globalSyncResourcesInterval + // This option defines how often (in miliseconds) are resources/collections + // asynchronously synchronized. + // Example: + var globalSyncResourcesInterval=120000; + + + // globalEnableRefresh + // This option enables or disables the manual synchronization button in + // the interface. If this option is enabled then users can perform server + // synchronization manually. Enabling this option may cause high server + // load (even DDOS) if users will try to manually synchronize data too + // often (instead of waiting for the automatic synchronization). + // If undefined or false, the synchronization button is disabled. + // NOTE: enable this option only if you really know what are you doing! + // Example: + var globalEnableRefresh=false; + + + // globalEnableKbNavigation + // Enable basic keyboard navigation using arrow keys? + // If undefined or not false, keyboard navigation is enabled. + // Example: + var globalEnableKbNavigation=true; + + + // globalSettingsType + // Where to store user settings such as: active view, enabled/selected + // collections, ... (the client store them into DAV property on the server). + // NOTE: not all servers support storing DAV properties (some servers support + // only subset /or none/ of these URLs). + // Supported values: + // - 'principal-URL', '', null or undefined (default) => settings are stored + // to principal-URL (recommended for most servers) + // - 'addressbook-home-set' => settings are are stored to addressbook-home-set + // - 'calendar-home-set' => settings are stored to calendar-home-set + // Example: + //var globalSettingsType=''; + + + // globalCrossServerSettingsURL + // Settings such as enabled/selected collections are stored on the server + // (see the previous option) in form of full URL + // (e.g.: https://user@server:port/principal/collection/), but even if this + // approach is "correct" (you can use the same principal URL with multiple + // different logins, ...) it causes a problem if your server is accessible + // from multiple URLs (e.g. http://server/ and https://server/). If you want + // to store only the "principal/collection/" part of the URL (instead of the + // full URL) then enable this option. + // Example: + //var globalCrossServerSettingsURL=false; + + + // globalInterfaceLanguage + // Default interface language (note: this option is case sensitive): + // cs_CZ (Čeština [Czech]) + // da_DK (Dansk [Danish]; thanks Niels Bo Andersen) + // de_DE (Deutsch [German]; thanks Marten Gajda and Thomas Scheel) + // en_US (English [English/US]) + // es_ES (Español [Spanish]; thanks Damián Vila) + // fr_FR (Français [French]; thanks John Fischer) + // it_IT (Italiano [Italian]; thanks Luca Ferrario) + // ja_JP (日本語 [Japan]; thanks Muimu Nakayama) + // hu_HU (Magyar [Hungarian]) + // nl_NL (Nederlands [Dutch]; thanks Johan Vromans) + // sk_SK (Slovenčina [Slovak]) + // tr_TR (Türkçe [Turkish]; thanks Selcuk Pultar) + // ru_RU (Русский [Russian]; thanks Александр Симонов) + // uk_UA (Українська [Ukrainian]; thanks Serge Yakimchuck) + // zh_CN (中国 [Chinese]; thanks Fandy) + // Example: + var globalInterfaceLanguage='en_US'; + + + // globalInterfaceCustomLanguages + // If defined and not empty then only languages listed here are shown + // at the login screen, otherwise (default) all languages are shown + // NOTE: values in the array must refer to an existing localization + // (see the option above) + // Example: + // globalInterfaceCustomLanguages=['en_US', 'sk_SK']; + var globalInterfaceCustomLanguages=[]; + + + // globalSortAlphabet + // Use JavaScript localeCompare() or custom alphabet for data sorting. + // Custom alphabet is used by default because JavaScript localeCompare() + // not supports collation and often returns "wrong" result. If set to null + // then localeCompare() is used. + // Example: + // var globalSortAlphabet=null; + var globalSortAlphabet=' 0123456789'+ + 'AÀÁÂÄÆÃÅĀBCÇĆČDĎEÈÉÊËĒĖĘĚFGĞHIÌÍÎİÏĪĮJKLŁĹĽMNŃÑŇOÒÓÔÖŐŒØÕŌ'+ + 'PQRŔŘSŚŠȘșŞşẞTŤȚțŢţUÙÚÛÜŰŮŪVWXYÝŸZŹŻŽ'+ + 'aàáâäæãåābcçćčdďeèéêëēėęěfgğhiìíîïīįıjklłĺľmnńñňoòóôöőœøõō'+ + 'pqrŕřsśšßtťuùúûüűůūvwxyýÿzźżžАБВГҐДЕЄЖЗИІЇЙКЛМНОПРСТУФХЦЧШЩЮЯ'+ + 'Ьабвгґдеєжзиіїйклмнопрстуфхцчшщюяь'; + + + // globalSearchTransformAlphabet + // To support search without diacritics (e.g. search for 'd' will find: 'Ď', 'ď') + // it is required to define something like "character equivalence". + // key = regex text, value = search character + // Example: + var globalSearchTransformAlphabet={ + '[ÀàÁáÂâÄ䯿ÃãÅåĀā]': 'a', '[ÇçĆćČč]': 'c', '[Ďď]': 'd', + '[ÈèÉéÊêËëĒēĖėĘęĚě]': 'e', '[Ğğ]': 'g', '[ÌìÍíÎîİıÏïĪīĮį]': 'i', + '[ŁłĹ弾]': 'l', '[ŃńÑñŇň]': 'n', '[ÒòÓóÔôÖöŐőŒœØøÕõŌō]': 'o', + '[ŔŕŘř]': 'r', '[ŚśŠšȘșŞşẞß]': 's', '[ŤťȚțŢţ]': 't', + '[ÙùÚúÛûÜüŰűŮůŪū]': 'u', '[ÝýŸÿ]': 'y', '[ŹźŻżŽž]': 'z' + }; + + // globalResourceAlphabetSorting + // If more than one resource (server account) is configured, sort the + // resources alphabetically? + // Example: + var globalResourceAlphabetSorting=true; + + + // globalNewVersionNotifyUsers + // Update notification will be shown only to users with login names defined + // in this array. + // If undefined (or empty), update notifications will be shown to all users. + // Example: + // globalNewVersionNotifyUsers=['admin', 'peter']; + var globalNewVersionNotifyUsers=[]; + + + // globalDatepickerFormat + // Set the datepicker format (see + // http://docs.jquery.com/UI/Datepicker/formatDate for valid values). + // NOTE: date format is predefined for each localization - use this option + // ONLY if you want to use custom date format (instead of the localization + // predefined one). + // Example: + //var globalDatepickerFormat='dd.mm.yy'; + + + // globalDatepickerFirstDayOfWeek + // Set the datepicker first day of the week: Sunday is 0, Monday is 1, etc. + // Example: + var globalDatepickerFirstDayOfWeek=1; + + + // globalHideInfoMessageAfter + // How long are information messages (such as: success, error) displayed + // (in miliseconds). + // Example: + var globalHideInfoMessageAfter=1800; + + + // globalEditorFadeAnimation + // Set the editor fade in/out animation duration when editing or saving data + // (in miliseconds). + // Example: + var globalEditorFadeAnimation=666; + + + + + // ******* CalDAV (CalDavZAP) related settings ******* // + + // globalEventStartPastLimit, globalEventStartFutureLimit, globalTodoPastLimit + // Number of months pre-loaded from past/future in advance for calendars + // and todo lists (if null then date range synchronization is disabled). + // NOTE: interval synchronization is used only if your server supports + // sync-collection REPORT (e.g. DAViCal). + // NOTE: if you experience problems with data loading and your server has + // no time-range filtering support set these variables to null. + // Example: + var globalEventStartPastLimit=3; + var globalEventStartFutureLimit=3; + var globalTodoPastLimit=1; + + + // globalLoadedCalendarCollections + // This option sets the list of calendar collections (down)loaded after login. + // If empty then all calendar collections for the currently logged user are + // loaded. + // NOTE: settings stored on the server (see settingsAccount) overwrite this + // option. + // Example: + var globalLoadedCalendarCollections=[]; + + + // globalLoadedTodoCollections + // This option sets the list of todo collections (down)loaded after login. + // If empty then all todo collections for the currently logged user are loaded. + // NOTE: settings stored on the server (see settingsAccount) overwrite this + // option. + // Example: + var globalLoadedTodoCollections=[]; + + + // globalActiveCalendarCollections + // This options sets the list of calendar collections checked (enabled + // checkbox => data visible in the interface) by default after login. + // If empty then all loaded calendar collections for the currently logged + // user are checked. + // NOTE: only already (down)loaded collections can be checked (see + // the globalLoadedCalendarCollections option). + // NOTE: settings stored on the server (see settingsAccount) overwrite this + // option. + // Example: + var globalActiveCalendarCollections=[]; + + + // globalActiveTodoCollections + // This options sets the list of todo collections checked (enabled + // checkbox => data visible in the interface) by default after login. + // If empty then all loaded todo collections for the currently logged + // user are checked. + // NOTE: only already (down)loaded collections can be checked (see + // the globalLoadedTodoCollections option). + // NOTE: settings stored on the server (see settingsAccount) overwrite this + // option. + // Example: + var globalActiveTodoCollections=[]; + + + // globalCalendarSelected + // This option sets which calendar collection will be pre-selected + // (if you create a new event) by default after login. + // The value must be URL encoded path to a calendar collection, + // for example: 'USER/calendar/' + // If empty or undefined then the first available calendar collection + // is selected automatically. + // NOTE: only already (down)loaded collections can be pre-selected (see + // the globalLoadedCalendarCollections option). + // NOTE: settings stored on the server (see settingsAccount) overwrite this + // option. + // Example: + //var globalCalendarSelected=''; + + + // globalTodoCalendarSelected + // This option sets which todo collection will be pre-selected + // (if you create a new todo) by default after login. + // The value must be URL encoded path to a todo collection, + // for example: 'USER/todo_calendar/' + // If empty or undefined then the first available todo collection + // is selected automatically. + // NOTE: only already (down)loaded collections can be pre-selected (see + // the globalLoadedTodoCollections option). + // NOTE: settings stored on the server (see settingsAccount) overwrite this + // option. + // Example: + //var globalTodoCalendarSelected=''; + + + // globalActiveView + // This options sets the default fullcalendar view option (the default calendar + // view after the first login). + // Supported values: + // - 'month' + // - 'multiWeek' + // - 'agendaWeek' + // - 'agendaDay' + // NOTE: we use custom and enhanced version of fullcalendar! + // Example: + var globalActiveView='multiWeek'; + + + // globalOpenFormMode + // Open new event form on 'single' or 'double' click. + // If undefined or not 'double', then 'single' is used. + // Example: + var globalOpenFormMode='double'; + + + // globalTodoListFilterSelected + // This options sets the list of filters in todo list that are selected + // after login. + // Supported options: + // - 'filterAction' + // - 'filterProgress' (available only if globalAppleRemindersMode is disabled) + // - 'filterCompleted' + // - 'filterCanceled' (available only if globalAppleRemindersMode is disabled) + // NOTE: settings stored on the server (see settingsAccount) overwrite this + // option. + // Example: + var globalTodoListFilterSelected=['filterAction', 'filterProgress']; + + + // globalCalendarStartOfBusiness, globalCalendarEndOfBusiness + // These options set the start and end of business hours with 0.5 hour + // precision. Non-business hours are faded out in the calendar interface. + // If both variables are set to the same value then no fade out occurs. + // Example: + var globalCalendarStartOfBusiness=8; + var globalCalendarEndOfBusiness=17; + + + // globalDefaultEventDuration + // This option sets the default duration (in minutes) for newly created events. + // If undefined or null, globalCalendarEndOfBusiness value will be taken as + // a default end time instead. + // Example: + var globalDefaultEventDuration=120; + + + // globalAMPMFormat + // This option enables to use 12 hours format (AM/PM) for displaying time. + // NOTE: time format is predefined for each localization - use this option + // ONLY if you want to use custom time format (instead of the localization + // predefined one). + // Example: + //var globalAMPMFormat=false; + + + // globalTimeFormatBasic + // This option defines the time format information for events in month and + // multiweek views. If undefined or null then default value is used. + // If defined as empty string no time information is shown in these views. + // See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for exact + // formating rules. + // Example: + //var globalTimeFormatBasic=''; + + + // globalTimeFormatAgenda + // This option defines the time format information for events in day and + // week views. If undefined or null then default value is used. + // If defined as empty string no time information is shown in these views. + // See http://arshaw.com/fullcalendar/docs/utilities/formatDate/ for exact + // formating rules. + // Example: + //var globalTimeFormatAgenda=''; + + + // globalDisplayHiddenEvents + // This option defined whether events from unechecked calendars are displayed + // with certain transparency (true) or completely hidden (false). + // Example: + var globalDisplayHiddenEvents=false; + + + // globalTimeZoneSupport + // This option enables timezone support in the client. + // NOTE: timezone cannot be specified for all-day events because these don't + // have start and end time. + // If this option is disabled then local time is used. + // Example: + var globalTimeZoneSupport=true; + + + // globalTimeZone + // If timezone support is enabled, this option sets the default timezone. + // See timezones.js or use the following command to get the list of supported + // timezones (defined in timezones.js): + // grep "'[^']\+': {" timezones.js | sed -Ee "s#(\s*'|':\s*\{)##g" + // Example: + var globalTimeZone='Europe/Moscow'; + + + // globalTimeZonesEnabled + // This option sets the list of available timezones in the interface (for the + // list of supported timezones see the comment for the previous configuration + // option). + // NOTE: if there is at least one event/todo with a certain timezone defined, + // that timezone is enabled (even if it is not present in this list). + // Example: + // var globalTimeZonesEnabled=['America/New_York', 'Europe/Berlin']; + var globalTimeZonesEnabled=[]; + + + // globalRewriteTimezoneComponent + // This options sets whether the client will enhance/replace (if you edit an + // event or todo) the timezone information using the official IANA timezone + // database information (recommended). + // Example: + var globalRewriteTimezoneComponent=true; + + + // globalRemoveUnknownTimezone + // This options sets whether the client will remove all non-standard timezone + // names from events and todos (if you edit an event or todo) + // (e.g.: /freeassociation.sourceforge.net/Tzfile/Europe/Vienna) + // Example: + var globalRemoveUnknownTimezone=false; + + + // globalShowHiddenAlarms + // This option sets whether the client will show alarm notifications for + // unchecked calendars. If this option is enabled and you uncheck a calendar + // in the calendar list, alarm notifications will be temporary disabled for + // unchecked calendar(s). + // Example: + var globalShowHiddenAlarms=false; + + + // globalIgnoreCompletedOrCancelledAlarms + // This options sets whether the client will show alarm notifications for + // already completed or cancelled todos. If enabled then alarm notification + // for completed and cancelled todos are disabled. + // Example: + var globalIgnoreCompletedOrCancelledAlarms=true; + + + // globalMozillaSupport + // Mozilla automatically treats custom repeating event calculations as if + // the start day of the week is Monday, despite what day is chosen in settings. + // Set this variable to true to use the same approach, ensuring compatible + // event rendering in special cases. + // Example: + var globalMozillaSupport=false; + + + // globalCalendarColorPropertyXmlns + // This options sets the namespace used for storing the "calendar-color" + // property by the client. + // If true, undefined (or empty) "http://apple.com/ns/ical/" is used (Apple + // compatible). If false, then the calendar color modification functionality + // is completely disabled. + // Example: + //var globalCalendarColorPropertyXmlns=true; + + + // globalWeekendDays + // This option sets the list of days considered as weekend days (these + // are faded out in the calendar interface). Non-weekend days are automatically + // considered as business days. + // Sunday is 0, Monday is 1, etc. + // Example: + var globalWeekendDays=[0, 6]; + + + // globalAppleRemindersMode + // If this option is enabled then then client will use the same approach + // for handling repeating reminders (todos) as Apple. It is STRONGLY + // recommended to enabled this option if you use any Apple clients for + // reminders (todos). + // Supported options: + // - 'iOS6' + // - 'iOS7' + // - true (support of the latest iOS version - 'iOS8') + // - false + // If this option is enabled: + // - RFC todo support is SEVERELY limited and the client mimics the behaviour + // of Apple Reminders.app (to ensure maximum compatibility) + // - when a single instance of repeating todo is edited, it becomes an + // autonomous non-repeating todo with NO relation to the original repeating + // todo + // - capabilities of repeating todos are limited - only the first instance + // is ever visible in the interface + // - support for todo DTSTART attribute is disabled + // - support for todo STATUS attribute other than COMPLETED and NEEDS-ACTION + // is disabled + // - [iOS6 only] support for LOCATION and URL attributes is disabled + // Example: + var globalAppleRemindersMode=true; + + + // globalSubscribedCalendars + // This option specifies a list of remote URLs to ics files (e.g.: used + // for distributing holidays information). Subscribed calendars are + // ALWAYS read-only. Remote servers where ics files are hosted MUST + // return proper CORS headers (see readme.txt) otherwise this functionality + // will not work! + // NOTE: subsribed calendars are NOT "shared" calendars. For "shared" + // calendars see the delegation option in globalAccountSettings, + // globalNetworkCheckSettings and globalNetworkAccountSettings. + // List of properties used in globalSubscribedCalendars variable: + // - hrefLabel + // This options defines the header string above the subcsribed calendars. + // - calendars + // This option specifies an array of remote calendar objects with the + // following properties: + // - href + // Set this option to the "full URL" of the remote calendar + // - userAuth + // NOTE: keep empty if remote authentication is not required! + // - userName + // Set the username you want to login. + // - userPassword + // Set the password for the given username. + // - typeList + // Set the list of objects you want to process from remote calendars; + // two options are available: + // - 'vevent' (show remote events in the interface) + // - 'vtodo' (show remote todos in the interface) + // - ignoreAlarm + // Set this option to true if you want to disable alarm notifications + // from the remote calendar. + // - displayName + // Set this option to the name of the calendar you want to see + // in the interface. + // - color + // Set the calendar color you want to see in the interface. + // Example: + //var globalSubscribedCalendars={ + // hrefLabel: 'Subscribed', + // calendars: [ + // { + // href: 'http://something.com/calendar.ics', + // userAuth: { + // userName: '', + // userPassword: '' + // }, + // typeList: ['vevent', 'vtodo'], + // ignoreAlarm: true, + // displayName: 'Remote Calendar 1', + // color: '#ff0000' + // }, + // { + // href: 'http://calendar.com/calendar2.ics', + // ... + // ... + // } + // ] + //}; + + + + // ******* CardDAV (CardDavMATE) related settings ******* // + + + // globalLoadedAddressbookCollections + // This option sets the list of addressbook collections (down)loaded after + // login. If empty then all addressbook collections for the currently logged + // user are loaded. + // NOTE: settings stored on the server (see settingsAccount) overwrite this + // option. + // Example: + var globalLoadedAddressbookCollections=[]; + + + // globalActiveAddressbookCollections + // This options sets the list of addressbook collections checked (enabled + // checkbox => data visible in the interface) by default after login. + // If empty then all loaded addressbook collections for the currently logged + // user are checked. + // NOTE: only already (down)loaded collections can be checked (see + // the globalLoadedAddressbookCollections option). + // NOTE: settings stored on the server (see settingsAccount) overwrite this + // option. + // Example: + var globalActiveAddressbookCollections=[]; + + + // globalAddressbookSelected + // This option sets which addressbook collection will be pre-selected + // (if you create a new contact) by default after login. + // The value must be URL encoded path to an addressbook collection, + // for example: 'USER/addressbook/' + // If empty or undefined then the first available addressbook collection + // is selected automatically. + // NOTE: only already (down)loaded collections can be pre-selected (see + // the globalLoadedAddressbookCollections option). + // NOTE: settings stored on the server (see settingsAccount) overwrite this + // option. + // Example: + //var globalAddressbookSelected=''; + + + // globalCompatibility + // This options is reserved for various compatibility settings. + // NOTE: if this option is used the value must be an object. + // Currently there is only one supported option: + // - anniversaryOutputFormat + // Different clients use different (and incompatible) approach + // to store anniversary date in vCards. Apple stores this attribute as: + // itemX.X-ABDATE;TYPE=pref:2000-01-01\r\n + // itemX.X-ABLabel:_$!!$_\r\n' + // other clients store this attribute as: + // X-ANNIVERSARY:2000-01-01\r\n + // Choose 'apple' or 'other' (lower case) for your 3rd party client + // compatibility. You can chose both: ['apple', 'other'], but it may + // cause many problems in the future, for example: duplicate anniversary + // dates, invalid/old anniversary date in your clients, ...) + // Examples: + // anniversaryOutputFormat: ['other'] + // anniversaryOutputFormat: ['apple', 'other'] + // Example: + var globalCompatibility={anniversaryOutputFormat: ['apple']}; + + + // globalUriHandler{Tel,Email,Url,Profile} + // These options set the URI handlers for TEL, EMAIL, URL and X-SOCIALPROFILE + // vCard attributes. Set them to null (or comment out) to disable. + // NOTE: for globalUriHandlerTel is recommended to use 'tel:', 'callto:' + // or 'skype:'. The globalUriHandlerUrl value is used only if no URI handler + // is defined in the URL. + // NOTE: it is safe to keep these values unchanged! + // Example: + var globalUriHandlerTel='tel:'; + var globalUriHandlerEmail='mailto:'; + var globalUriHandlerUrl='http://'; + var globalUriHandlerProfile={ + 'twitter': 'http://twitter.com/%u', + 'facebook': 'http://www.facebook.com/%u', + 'flickr': 'http://www.flickr.com/photos/%u', + 'linkedin': 'http://www.linkedin.com/in/%u', + 'myspace': 'http://www.myspace.com/%u', + 'sinaweibo': 'http://weibo.com/n/%u' + }; + + + // globalDefaultAddressCountry + // This option sets the default country for new address fields. + // See common.js or use the following command to get the list of + // all supported country codes (defined in common.js): + // grep -E "'[a-z]{2}':\s+\[" common.js | sed -Ee 's#^\s+|\s+\[\s+# #g' + // Example: + var globalDefaultAddressCountry='us'; + + + // globalAddressCountryEquivalence + // This option sets the processing of the country field specified + // in the vCard ADR attribute. + // By default the address field in vCard looks like: + // ADR;TYPE=WORK:;;1 Waters Edge;Baytown;LA;30314;USA\r\n + // what cause a problem, because the country field is a plain + // text and can contain any value, e.g.: + // USA + // United States of America + // US + // and because the address format can be completely different for + // each country, e.g.: + // China address example: + // [China] + // [Province] [City] + // [Street] + // [Postal] + // Japan address example: + // [Postal] + // [Prefecture] [County/City] + // [Further Divisions] + // [Japan] + // the client needs to correctly detect the country from the ADR + // attribute. Apple solved this problem by using: + // item1.ADR;TYPE=WORK:;;1 Waters Edge;Baytown;LA;30314;USA\r\n + // item1.X-ABADR:us\r\n + // where the second "related" attribute defines the country code + // for the ADR attribute. This client uses the same approach, but + // if the vCard is created by 3rd party clients and the X-ABADR + // is missing, it is possible to define additional "rules" for + // country matching. These rules are specied by the country code + // (for full list of country codes see the comment for pre previous + // option) and a case insensitive regular expression (which matches + // the plain text value in the country field). + // NOTE: if X-ABADR is not present and the country not matches any + // country defined in this option, then globalDefaultAddressCountry + // is used by default. + // Example: + var globalAddressCountryEquivalence=[ + {country: 'de', regex: '^\\W*Deutschland\\W*$'}, + {country: 'sk', regex: '^\\W*Slovensko\\W*$'} + ]; + + + // globalAddressCountryFavorites + // This option defines the list of countries which are shown at the top + // of the country list in the interface (for full list of country codes + // see the comment for pre globalDefaultAddressCountry option). + // Example: + // var globalAddressCountryFavorites=['de','sk']; + var globalAddressCountryFavorites=[]; + + + // globalAddrColorPropertyXmlns + // This options sets the namespace used for storing the "addressbook-color" + // property by the client. + // If true, undefined (or empty) "http://inf-it.com/ns/ab/" is used. + // If false, then the addressbook color modification functionality + // is completely disabled, and addressbook colors in the interface are + // generated automatically. + // Example: + //var globalAddrColorPropertyXmlns=true; + + + // globalContactStoreFN + // This option specifies how the FN (formatted name) is stored into vCard. + // The value for this options must be an array of strings, that can contain + // the following variables: + // prefix + // last + // middle + // first + // suffix + // The string element of the array can contain any other characters (usually + // space or colon). Elements are added into FN only if the there is + // a variable match, for example if: + // last='Lastname' + // first='Firstname' + // middle='' (empty) + // and this option is set to: + // ['last', ' middle', ' first'] (space in the second and third element) + // the resulting value for FN will be: 'Lastname Firstname' and not + // 'Lastname Firstname' (two spaces), because the middle name is empty (so + // the second element is completely ignored /not added into FN/). + // NOTE: this attribute is NOT used by this client, and it is also NOT + // possible to directly edit it in the interface. + // Examples: + // var globalContactStoreFN=[' last', ' middle', ' first']; + // var globalContactStoreFN=['last', ', middle', ' ,first']; + var globalContactStoreFN=['prefix',' last',' middle',' first',' suffix']; + + + // globalGroupContactsByCompanies + // This options specifies how contacts are grouped in the interface. + // By default the interface looks like (very simple example): + // A + // Adams Adam + // Anderson Peter + // B + // Brown John + // Baker Josh + // if grouped by company/deparment the result is: + // Company A [Department X] + // Adams Adam + // Brown John + // Company B [Department Y] + // Anderson Peter + // Baker Josh + // If this option is set to true contacts are grouped by company/department, + // otherwise (default) contacts are grouped by letters of the alphabet. + // If undefined or not true, grouping by alphabet letters is used. + // NOTE: see also the globalCollectionDisplay option below. + var globalGroupContactsByCompanies=false; + + + // globalCollectionDisplay + // This options specifies how data columns in the contact list are displayed. + // + // NOTE: columns are displayed ONLY if there is enought horizontal place in + // the browser window (e.g. if you define 5 columns here, but your browser + // window is not wide enough, you will see only first 3 columns instead of 5). + // + // NOTE: see the globalContactDataMinVisiblePercentage option which defines the + // width for columns. + // + // The value must be an array of columns, where each column is represented by + // an object with the following properties: + // label => the value of this option is a string used as column header + // You can use the following localized variables in the label string: + // - {Name} + // - {FirstName} + // - {LastName} + // - {MiddleName} + // - {NickName} + // - {Prefix} + // - {Suffix} + // - {BirthDay} + // - {PhoneticLastName} + // - {PhoneticFirstName} + // - {JobTitle} + // - {Company} + // - {Department} + // - {Categories} + // - {NoteText} + // - {Address}, {AddressWork}, {AddressHome}, {AddressOther} + // - {Phone}, {PhoneWork}, {PhoneHome}, {PhoneCell}, {PhoneMain}, + // {PhonePager}, {PhoneFax}, {PhoneIphone}, {PhoneOther} + // - {Email}, {EmailWork}, {EmailHome}, {EmailMobileme}, {EmailOther} + // - {URL}, {URLWork}, {URLHome}, {URLHomepage}, {URLOther} + // - {Dates}, {DatesAnniversary}, {DatesOther} + // - {Related}, {RelatedManager}, {RelatedAssistant}, {RelatedFather}, + // {RelatedMother}, {RelatedParent}, {RelatedBrother}, {RelatedSister}, + // {RelatedChild}, {RelatedFriend}, {RelatedSpouse}, {RelatedPartner}, + // {RelatedOther} + // - {Profile}, {ProfileTwitter}, {ProfileFacebook}, {ProfileFlickr}, + // {ProfileLinkedin}, {ProfileMyspace}, {ProfileSinaweibo} + // - {IM}, {IMWork}, {IMHome}, {IMMobileme}, {IMOther}, {IMAim}, {IMIcq}, + // {IMIrc}, {IMJabber}, {IMMsn}, {IMYahoo}, {IMFacebook}, {IMGadugadu}, + // {IMGoogletalk}, {IMQq}, {IMSkype} + // value => the value of this option is an array of format strings, or + // an object with the following properties: + // - company (used for company contacts) + // - personal (used for user contacts) + // where the value of these properties is an array of format strings used + // for company or user contacts (you can have different values in the same + // column for personal and company contacts). + // You can use the following simple variables in the format string: + // - {FirstName} + // - {LastName} + // - {MiddleName} + // - {NickName} + // - {Prefix} + // - {Suffix} + // - {BirthDay} + // - {PhoneticLastName} + // - {PhoneticFirstName} + // - {JobTitle} + // - {Company} + // - {Department} + // - {Categories} + // - {NoteText} + // You can also use parametrized variables, where the parameter is enclosed + // in square bracket. Paramatrized variables are useful to extract data + // such as home phone {Phone[type=home]}, extract the second phone number + // {Phone[:1]} (zero based indexing) or extract the third home phone number + // {Phone[type=home][:2]} from the vCard. + // NOTE: if the parametrized variable matches multiple items, e.g.: + // {Phone[type=work]} (if the contact has multiple work phones) then the + // first one is used! + // + // The following parametrized variables are supported (note: you can use + // all of them also without parameters /the first one will be used/): + // - {Address[type=XXX]} or {Address[:NUM]} or {Address[type=XXX][:NUM]} + // where supported values for XXX are: + // - work + // - home + // - other + // - any other custom value + // - {Phone[type=XXX]} or {Phone[:NUM]} or {Phone[type=XXX][:NUM]} + // where supported values for XXX are: + // - work + // - home + // - cell + // - main + // - pager + // - fax + // - iphone + // - other + // - any other custom value + // - {Email[type=XXX]} or {Email[:NUM]} or {Email[type=XXX][:NUM]} + // where supported values for XXX are: + // - work + // - home + // - mobileme + // - other + // - any other custom value + // - {URL[type=XXX]} or {URL[:NUM]} or {URL[type=XXX][:NUM]} + // where supported values for XXX are: + // - work + // - home + // - homepage + // - other + // - any other custom value + // - {Dates[type=XXX]} or {Dates[:NUM]} or {Dates[type=XXX][:NUM]} + // where supported values for XXX are: + // - anniversary + // - other + // - any other custom value + // - {Related[type=XXX]} or {Related[:NUM]} or {Related[type=XXX][:NUM]} + // where supported values for XXX are: + // - manager + // - assistant + // - father + // - mother + // - parent + // - brother + // - sister + // - child + // - friend + // - spouse + // - partner + // - other + // - any other custom value + // - {Profile[type=XXX]} or {Profile[:NUM]} or {Profile[type=XXX][:NUM]} + // where supported values for XXX are: + // - twitter + // - facebook + // - flickr + // - linkedin + // - myspace + // - sinaweibo + // - any other custom value + // - {IM[type=XXX]} or {IM[service-type=YYY]} or {IM[:NUM]} + // where supported values for XXX are: + // - work + // - home + // - mobileme + // - other + // - any other custom value + // and supported values for YYY are: + // - aim + // - icq + // - irc + // - jabber + // - msn + // - yahoo + // - facebook + // - gadugadu + // - googletalk + // - qq + // - skype + // - any other custom value + // + // NOTE: if you want to use the "any other custom value" option (for XXX + // or YYY above) you MUST double escape the following characters: + // =[]{}\ + // for example: + // - for profile type "=XXX=" use: '{Profile[type=\\=XXX\\=]}' + // - for profile type "\XXX\" use: '{Profile[type=\\\\XXX\\\\]}' + // + // NOTE: if you want to use curly brackets in the format string you must + // double escape it, e.g.: ['{Company}', '\\{{Department}\\}'] + // + // The format string (for the value option) is an array to allow full + // customization of the interface. For example if: + // value: ['{LastName} {MiddleName} {FirstName}'] + // and the person has no middle name, then the result in the column + // will be (without quotes): + // "Parker Peter" (note: two space characters) + // but if you use: + // value: ['{LastName}', ' {MiddleName}', ' {FirstName}'] + // then the result will be (without quotes): + // "Parker Peter" (note: only one space character) + // The reason is that only those elements of the array are appended + // into the result where non-empty substitution was performed (so the + // ' {MiddleName}' element in this case is ignored, because the person + // in the example above has no /more precisely has empty/ middle name). + // + // Examples: + // To specify two columns (named "Company" and "Department / LastName"), + // where the first will display the company name, and the second will display + // department for company contacts (with "Dep -" prefix), and lastname for + // personal contacts (with "Name -" prefix) use: + // var globalCollectionDisplay=[ + // { + // label: 'Company', + // value: ['{Company}'] + // }, + // { + // label: 'Department / LastName', + // value: { + // company: ['Dep - {Department}'], + // personal: ['Name - {LastName}'] + // } + // } + // ]; + // To specify 3 columns (named "Categories", "URL" and "IM"), where the first + // will display categories, second will display the third work URL, and third + // will display ICQ IM use: + // var globalCollectionDisplay=[ + // { + // label: 'Categories', + // value: ['{Categories}'] + // }, + // { + // label: 'URL', + // value: ['{URL[type=WORK][:2]}'] + // }, + // { + // label: 'IM', + // value: ['{IM[service-type=ICQ]}'] + // } + // ]; + // + // Recommended settings if globalGroupContactsByCompanies + // is set to false: + // var globalCollectionDisplay=[ + // { + // label: '{Name}', + // value: ['{LastName}', ' {MiddleName}', ' {FirstName}'] + // }, + // { + // label: '{Company} [{Department}]', + // value: ['{Company}', ' [{Department}]'] + // }, + // { + // label: '{JobTitle}', + // value: ['{JobTitle}'] + // }, + // { + // label: '{Email}', + // value: ['{Email[:0]}'] + // }, + // { + // label: '{Phone} 1', + // value: ['{Phone[:0]}'] + // }, + // { + // label: '{Phone} 2', + // value: ['{Phone[:1]}'] + // }, + // { + // label: '{NoteText}', + // value: ['{NoteText}'] + // } + // ]; + // + // Recommended settings if globalGroupContactsByCompanies + // is set to true: + // var globalCollectionDisplay=[ + // { + // label: '{Name}', + // value: { + // personal: ['{LastName}', ' {MiddleName}', ' {FirstName}'], + // company: ['{Company}', ' [{Department}]'] + // } + // }, + // { + // label: '{JobTitle}', + // value: ['{JobTitle}'] + // }, + // { + // label: '{Email}', + // value: ['{Email[:0]}'] + // }, + // { + // label: '{Phone} 1', + // value: ['{Phone[:0]}'] + // }, + // { + // label: '{Phone} 2', + // value: ['{Phone[:1]}'] + // }, + // { + // label: '{NoteText}', + // value: ['{NoteText}'] + // } + // ]; + // + // NOTE: if left undefined, the recommended settings will be used. + + + // globalCollectionSort + // This options sets the ordering of contacts in the interface. In general + // contacts are ordered alphabetically by an internal "sort string" which + // is created for each contact. Here you can specify how this internal string + // is created. The value is a simple array holding only the values from the + // value property defined in the globalCollectionDisplay option. + // If undefined, the definition from globalCollectionDisplay is used. + // Example: + // var globalCollectionSort = [ + // ['{LastName}'], + // ['{FirstName}'], + // ['{MiddleName}'], + // { + // company: ['{Categories}'], + // personal: ['{Company}'] + // } + // ]; + + + // globalContactDataMinVisiblePercentage + // This option defines how the width for columns are computed. If you set + // it to 1 then 100% of all data in the column will be visible (the column + // width is determined by the longest string in the column). If you set it + // to 0.95 then 95% of data will fit into the column width, and the remaining + // 5% will be truncated (" ..."). + // Example: + var globalContactDataMinVisiblePercentage=0.95; + + diff --git a/clusters/base/apps/infcloud/helmrelease-infcloud.yaml b/clusters/base/apps/infcloud/helmrelease-infcloud.yaml new file mode 100644 index 0000000..00573b1 --- /dev/null +++ b/clusters/base/apps/infcloud/helmrelease-infcloud.yaml @@ -0,0 +1,62 @@ +apiVersion: helm.toolkit.fluxcd.io/v2 +kind: HelmRelease +metadata: + name: infcloud + namespace: pim +spec: + interval: 10m + chartRef: + kind: OCIRepository + name: infcloud + driftDetection: + mode: enabled + values: + controllers: + infcloud: + containers: + app: + image: + repository: waja/infcloud + tag: "0.13.1-16" + probes: + liveness: + enabled: true + readiness: + enabled: true + + service: + app: + controller: infcloud + ports: + http: + port: 80 + + ingress: + app: + className: traefik + # this ingress owns the cert-manager request for c2.aggtaa.com; + # davical's ingress adds a second host on the same domain (for the + # /server CalDAV path) and just references the secret below. + annotations: + cert-manager.io/cluster-issuer: letsencrypt-prod + hosts: + - host: c2.aggtaa.com + paths: + - path: / + pathType: Prefix + service: + identifier: app + port: http + tls: + - secretName: infcloud-tls + hosts: + - c2.aggtaa.com + + persistence: + config: + type: configMap + name: infcloud-config + globalMounts: + - path: /srv/infcloud/config/config.js + subPath: config.js + readOnly: true diff --git a/clusters/base/apps/infcloud/helmrepository.yaml b/clusters/base/apps/infcloud/helmrepository.yaml new file mode 100644 index 0000000..b5707ec --- /dev/null +++ b/clusters/base/apps/infcloud/helmrepository.yaml @@ -0,0 +1,10 @@ +apiVersion: source.toolkit.fluxcd.io/v1 +kind: OCIRepository +metadata: + name: infcloud + namespace: pim +spec: + interval: 10m + url: oci://ghcr.io/bjw-s-labs/helm/app-template + ref: + tag: "5.0.1" diff --git a/clusters/base/apps/infcloud/kustomization.yaml b/clusters/base/apps/infcloud/kustomization.yaml new file mode 100644 index 0000000..c93e7e8 --- /dev/null +++ b/clusters/base/apps/infcloud/kustomization.yaml @@ -0,0 +1,6 @@ +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization +resources: + - helmrepository.yaml + - configmap.yaml + - helmrelease-infcloud.yaml diff --git a/clusters/home/apps/infcloud.yaml b/clusters/home/apps/infcloud.yaml new file mode 100644 index 0000000..8e7826f --- /dev/null +++ b/clusters/home/apps/infcloud.yaml @@ -0,0 +1,21 @@ +apiVersion: kustomize.toolkit.fluxcd.io/v1 +kind: Kustomization +metadata: + name: infcloud + namespace: flux-system +spec: + interval: 10m + sourceRef: + kind: GitRepository + name: flux-system + path: ./clusters/base/apps/infcloud + prune: true + wait: true + dependsOn: + - name: namespaces + - name: infra + retryInterval: 5s + decryption: + provider: sops + secretRef: + name: sops-age diff --git a/clusters/home/apps/kustomization.yaml b/clusters/home/apps/kustomization.yaml index cf1cc03..d0934cd 100644 --- a/clusters/home/apps/kustomization.yaml +++ b/clusters/home/apps/kustomization.yaml @@ -12,4 +12,5 @@ resources: - markdown-vault-mcp.yaml - nfs-ganesha.yaml - webdav.yaml - - fava.yaml \ No newline at end of file + - fava.yaml + - infcloud.yaml \ No newline at end of file