{"version":3,"file":"publication.2b1147d0.bundle.js","mappings":"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","sources":["webpack://list-client/./src/app/PublicMainVM.ts","webpack://list-client/./src/app/viewModel/public/PublicationDetail.ts","webpack://list-client/./src/app/services/public/ViewModelFactory.ts","webpack://list-client/./src/app/services/public/PublicMasterData.ts","webpack://list-client/./src/app/viewModel/public/PublicationTable.ts","webpack://list-client/./src/app/viewModel/public/PublicationTab.ts","webpack://list-client/./src/app/viewModel/public/SampleStatTab.ts","webpack://list-client/./src/app/repository/SampleStatisticsRepository.ts","webpack://list-client/./src/app/viewModel/public/SampleStatTable.ts","webpack://list-client/./src/app/services/public/CompositionRoot.ts","webpack://list-client/./src/app/Public.ts","webpack://list-client/./src/app/auth/AuthConstants.ts","webpack://list-client/./src/app/dataRegistry/IMaterialsRegistry.ts","webpack://list-client/./src/app/helper/ArrayComparer.ts","webpack://list-client/./src/app/helper/DateHelper.ts","webpack://list-client/./src/app/helper/DownloadHelper.ts","webpack://list-client/./src/app/helper/SynthesisInstrumentHelper.ts","webpack://list-client/./src/app/model/Constants.ts","webpack://list-client/./src/app/model/Substrate.ts","webpack://list-client/./src/app/model/error/ApplicationError.ts","webpack://list-client/./src/app/model/masterdata/Material.ts","webpack://list-client/./src/app/model/masterdata/SelectList.ts","webpack://list-client/./src/app/repository/BaseControllerRepository.ts","webpack://list-client/./src/app/repository/CharacterizationInstrumentRepository.ts","webpack://list-client/./src/app/repository/CharacterizationTechniqueRepository.ts","webpack://list-client/./src/app/repository/CollaboratorRepository.ts","webpack://list-client/./src/app/repository/MaterialRepository.ts","webpack://list-client/./src/app/repository/ProjectRepository.ts","webpack://list-client/./src/app/repository/PublicationRepository.ts","webpack://list-client/./src/app/repository/SelectListRepository.ts","webpack://list-client/./src/app/repository/SynthesisInstrumentRepository.ts","webpack://list-client/./src/app/repository/SynthesisTechniqueRepository.ts","webpack://list-client/./src/app/services/remote/IRemoteServer.ts","webpack://list-client/./src/app/services/remote/RemoteError.ts","webpack://list-client/./src/app/services/remote/RemoteServer.ts","webpack://list-client/./src/ext/knockout-extensions/knockout-lazy-template.ts","webpack://list-client/./src/app/viewModel/popup/RoleSelectionPopup.ts","webpack://list-client/./src/app/services/user/UserManager.ts","webpack://list-client/./src/app/helper/citationParser/Bibtex.ts","webpack://list-client/./src/app/helper/citationParser/CitationParser.ts","webpack://list-client/./src/app/viewModel/public/NewPublication.ts","webpack://list-client/./src/app/helper/citationParser/2DCC.ts","webpack://list-client/./src/app/viewModel/PublicationVM.ts","webpack://list-client/./src/app/viewModel/base/BaseViewModel.ts","webpack://list-client/./src/app/viewModel/base/DataObject.ts","webpack://list-client/./src/app/viewModel/popup/InfoPopup.ts","webpack://list-client/./src/app/viewModel/base/MainView.ts","webpack://list-client/./src/app/viewModel/base/Tab.ts","webpack://list-client/./src/app/viewModel/customizing/records/MaterialPopup.ts","webpack://list-client/./src/app/viewModel/materialSearch/Element.ts","webpack://list-client/./src/app/viewModel/materialSearch/ElementMap.ts","webpack://list-client/./src/app/viewModel/materialSearch/MaterialFilterVM.ts","webpack://list-client/./src/app/viewModel/materialSearch/MaterialMap.ts","webpack://list-client/./src/app/viewModel/materialSearch/SearchByMaterial.ts","webpack://list-client/./src/app/viewModel/popup/ErrorPopup.ts","webpack://list-client/./src/app/viewModel/popup/QuestionPopup.ts","webpack://list-client/./src/app/viewModel/popup/SignInAsPopup.ts","webpack://list-client/./src/app/viewModel/popup/ValidationPopup.ts","webpack://list-client/./src/ext/knockout-extension.ts","webpack://list-client/./src/ext/knockout-extensions/knockout-datepicker.ts","webpack://list-client/./src/ext/knockout-extensions/select2.ts","webpack://list-client/./src/ext/knockout-extensions/summernote.ts","webpack://list-client/./src/ext/logging.ts","webpack://list-client/./node_modules/moment/locale/ sync us","webpack://list-client/./node_modules/datatables.net-responsive/js/dataTables.responsive.mjs","webpack://list-client/./node_modules/datatables.net-responsive-bs/js/responsive.bootstrap.mjs"],"sourcesContent":["\r\nimport MainView from \"./viewModel/base/MainView\";\r\nimport IUserManager from \"./services/user/UserManager\";\r\nimport { Observable, ObservableArray } from \"knockout\";\r\nimport Tab from \"./viewModel/base/Tab\";\r\nimport ILoadableTab from \"./viewModel/base/ILoadableTab\";\r\nimport ko from \"knockout\";\r\n\r\n\r\nexport type PublicationTabType = Tab & ILoadableTab & { url: string };\r\n\r\n\r\nexport default class PublicMainVM extends MainView {\r\n public tabs: ObservableArray = ko.observableArray();\r\n public selectedTab: Observable = ko.observable();\r\n\r\n private _user: IUserManager;\r\n public get user() {\r\n return this._user;\r\n }\r\n public set user(user: IUserManager) {\r\n this._user = user;\r\n super.privileges = user.privileges;\r\n }\r\n\r\n public get masterData() {\r\n return this;\r\n }\r\n\r\n public addTab(tab: PublicationTabType) {\r\n tab.currentSelectedTab = this.selectedTab;\r\n this.tabs.push(tab);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n this.selectTab = this.selectTab.bind(this);\r\n }\r\n\r\n public isDirty(): boolean {\r\n return false;\r\n }\r\n\r\n public async selectTab(tab: PublicationTabType) {\r\n this.selectedTab(tab);\r\n const url = window.location.href;\r\n const pos = url.toLowerCase().indexOf(\"/public\");\r\n const baseUrl = url.substring(0, pos + \"/public\".length);\r\n history.pushState(null, \"\", `${baseUrl}/${tab.url}` );\r\n try {\r\n await tab.reload();\r\n } catch (error) {\r\n this.showError(error);\r\n }\r\n }\r\n}\r\n","import ko, { Observable, ObservableArray } from \"knockout\";\r\n\r\nimport { PublicationType, Status } from \"app/model/Constants\";\r\nimport { IPublication } from \"app/model/Publication\";\r\n\r\nimport MaterialVM from \"app/viewModel/materialSearch/MaterialFilterVM\";\r\nimport IViewModelFactory from \"app/services/public/ViewModelFactory\";\r\nimport { Privilege, Operation } from \"app/auth/AuthConstants\";\r\nimport IPublicationRepository from \"app/repository/PublicationRepository\";\r\nimport IMainView from \"../base/IMainView\";\r\nimport QuestionPopup from \"../popup/QuestionPopup\";\r\nimport IUserManager from \"app/services/user/UserManager\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\n\r\ntype InstrumentReference = {\r\n name: string;\r\n doi: string;\r\n link: string;\r\n hasDoi: boolean;\r\n};\r\n\r\nexport default class PublicationDetail {\r\n public get templateName() {\r\n return \"public/Detail\";\r\n }\r\n\r\n public projectLabels: string[];\r\n public title: Observable = ko.observable();\r\n public year: Observable = ko.observable();\r\n public type: Observable = ko.observable();\r\n public authors: Observable = ko.observable();\r\n public journal: Observable = ko.observable();\r\n public cite: Observable = ko.observable();\r\n public description: Observable = ko.observable();\r\n public doi: Observable = ko.observable();\r\n public materials: ObservableArray = ko.observableArray();\r\n\r\n public instruments: ObservableArray = ko.observableArray();\r\n\r\n public get materialsWithExternalLink(): MaterialVM[] {\r\n return this.materials().filter((m) => m.externalId);\r\n }\r\n\r\n public link: Observable = ko.observable();\r\n public dataLink: Observable = ko.observable();\r\n\r\n public canEdit: boolean;\r\n public canHide: boolean;\r\n\r\n private readonly _viewModelFactory: IViewModelFactory;\r\n private readonly _repo: IPublicationRepository;\r\n private readonly _mainView: IMainView;\r\n private _model: IPublication;\r\n private readonly _onChange: (modified: IPublication) => void;\r\n private readonly _remote: IRemoteServer;\r\n\r\n constructor(\r\n model: IPublication,\r\n onChange: (modified: IPublication) => void,\r\n mainView: IMainView,\r\n userManager: IUserManager,\r\n viewModelFactory: IViewModelFactory,\r\n repo: IPublicationRepository,\r\n remote: IRemoteServer\r\n ) {\r\n this._repo = repo;\r\n this._viewModelFactory = viewModelFactory;\r\n this._mainView = mainView;\r\n this._remote = remote;\r\n\r\n this._onChange = onChange;\r\n this.setModelData(model);\r\n\r\n this.canEdit = userManager.isAuthorized(Privilege.Publication, Operation.Update);\r\n this.canHide = userManager.isAuthorized(Privilege.Publication, Operation.Delete);\r\n }\r\n\r\n public setModelData(model?: IPublication) {\r\n if (model) {\r\n this.title(model.title);\r\n this.year(model.year);\r\n this.type(model.type);\r\n this.authors(model.authors);\r\n this.journal(model.journal);\r\n this.cite(model.cite);\r\n this.doi(model.doi);\r\n this.description(model.description);\r\n if (model.materials) {\r\n this.materials(model.materials.map((m) => new MaterialVM(m)));\r\n }\r\n this.link(model.doi ? `https://doi.org/${model.doi}` : \"\");\r\n this.dataLink(model.hasData ? this._remote.createRelativeUrl(`/data?publicationId=${model.doi ?? model.id}`) : null);\r\n\r\n this.instruments(\r\n [...model.synthesisInstruments, ...model.characterizationInstruments].map((i) => {\r\n return {\r\n name: `${i.id} (${i.name})`,\r\n doi: i.doi,\r\n link: `https://doi.org/${i.doi}`,\r\n hasDoi: !!i.doi,\r\n };\r\n })\r\n );\r\n\r\n this._model = model;\r\n }\r\n }\r\n\r\n public async edit(): Promise {\r\n const modified = await this._viewModelFactory.openPublicationEditor(this._model);\r\n if (modified) {\r\n this._onChange(modified);\r\n this.setModelData(modified);\r\n }\r\n }\r\n\r\n public async hide(): Promise {\r\n const doIt = await this._mainView.openPopup(\r\n new QuestionPopup(\r\n \"Remove publication\",\r\n `Do you want to remove this from the publication list? It will be hidden, but not deleted.`\r\n )\r\n );\r\n if (doIt) {\r\n try {\r\n await this._repo.delete(this._model.id);\r\n this._model.status = Status.Deleted;\r\n this._onChange(this._model);\r\n } catch (error) {\r\n this._mainView.showError(error);\r\n }\r\n }\r\n }\r\n}\r\n","import { IPublication } from \"app/model/Publication\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\nimport PublicationDetail from \"app/viewModel/public/PublicationDetail\";\r\nimport IMainView from \"app/viewModel/base/IMainView\";\r\nimport PublicationVM from \"app/viewModel/PublicationVM\";\r\nimport IPublicationRepository from \"app/repository/PublicationRepository\";\r\nimport IProjectRepository from \"app/repository/ProjectRepository\";\r\nimport IPublicMasterData from \"./IPublicMasterData\";\r\nimport IMaterial from \"app/model/masterdata/Material\";\r\nimport MaterialPopup from \"app/viewModel/customizing/records/MaterialPopup\";\r\nimport ApplicationError from \"app/model/error/ApplicationError\";\r\nimport IMaterialRepository from \"app/repository/MaterialRepository\";\r\nimport IUserManager from \"../user/UserManager\";\r\nimport { IDataPackage } from \"app/model/DataPackage\";\r\nimport DataPackageVM from \"app/viewModel/dataPackage/DataPackageVM\";\r\n\r\nexport default interface IViewModelFactory {\r\n openPublicationEditor(model: IPublication): Promise;\r\n getPublicationDetail(model: IPublication, onChange: (modified: IPublication) => void): PublicationDetail;\r\n createMaterial(): Promise;\r\n}\r\n\r\n\r\nexport class ViewModelFactory implements IViewModelFactory {\r\n private readonly _remote: IRemoteServer;\r\n private readonly _publicationRepo: IPublicationRepository;\r\n private readonly _materialRepo: IMaterialRepository;\r\n private readonly _projectRepo: IProjectRepository;\r\n private readonly _mainView: IMainView;\r\n private readonly _masterData: IPublicMasterData;\r\n private readonly _userManager: IUserManager;\r\n\r\n public constructor(\r\n remote: IRemoteServer,\r\n publicationRepo: IPublicationRepository,\r\n projectRepo: IProjectRepository,\r\n materialRepo: IMaterialRepository,\r\n mainView: IMainView,\r\n masterData: IPublicMasterData,\r\n userManager: IUserManager\r\n ) {\r\n this._remote = remote;\r\n this._mainView = mainView;\r\n this._publicationRepo = publicationRepo;\r\n this._materialRepo = materialRepo;\r\n this._projectRepo = projectRepo;\r\n this._masterData = masterData;\r\n this._userManager = userManager;\r\n }\r\n\r\n public async openPublicationEditor(model: IPublication): Promise {\r\n const viewModel = new PublicationVM(this._remote, this._publicationRepo, this._projectRepo, this, this.createMaterial.bind(this));\r\n\r\n viewModel.mainView = this._mainView;\r\n viewModel.masterData = this._masterData;\r\n viewModel.user = this._userManager;\r\n await viewModel.initViewModel();\r\n await viewModel.initWithModel(model);\r\n return this._mainView.openPopup(viewModel);\r\n }\r\n\r\n public getPublicationDetail(model: IPublication, onChange: (modified: IPublication) => void): PublicationDetail {\r\n return new PublicationDetail(model, onChange, this._mainView, this._userManager, this, this._publicationRepo, this._remote);\r\n }\r\n\r\n public async createMaterial(): Promise {\r\n try {\r\n const material = new MaterialPopup(this._materialRepo, this._mainView, this._masterData);\r\n return await this._mainView.openPopup(material);\r\n } catch (error) {\r\n this._mainView.showError(new ApplicationError(error, \"Could not Create User\"));\r\n return undefined;\r\n }\r\n }\r\n\r\n public getDataPackage(owner: PublicationVM, model: IDataPackage): Promise {\r\n throw new Error(\"Not implemented and should not be needed here\");\r\n }\r\n\r\n\r\n}\r\n","\r\nimport IPublicMasterData from \"./IPublicMasterData\";\r\nimport IScienceDriver from \"app/model/masterdata/ScienceDriver\";\r\nimport { ISelectListEntry, SelectList, SelectListMap } from \"app/model/masterdata/SelectList\";\r\nimport ISelectListRepository from \"app/repository/SelectListRepository\";\r\nimport IPublicationRepository from \"app/repository/PublicationRepository\";\r\nimport IUserManager from \"../user/UserManager\";\r\nimport IMaterialRepository from \"app/repository/MaterialRepository\";\r\nimport { Material } from \"app/model/masterdata/Material\";\r\nimport ISynthesisTechnique from \"app/model/masterdata/SynthesisTechnique\";\r\nimport ISynthesisTechniqueRepository from \"app/repository/SynthesisTechniqueRepository\";\r\nimport ICharacterizationTechniqueRepository from \"app/repository/CharacterizationTechniqueRepository\";\r\nimport ICharacterizationTechnique from \"app/model/masterdata/CharacterizationTechnique\";\r\nimport IMaterialsRegistry, { MaterialsRegistry } from \"app/dataRegistry/IMaterialsRegistry\";\r\nimport { Substrate } from \"app/model/Substrate\";\r\nimport ICharacterizationInstrument from \"app/model/masterdata/CharacterizationInstrument\";\r\nimport ISynthesisInstrument from \"app/model/masterdata/SynthesisInstrument\";\r\nimport ISynthesisInstrumentType from \"app/model/masterdata/SynthesisInstrumentType\";\r\nimport IRole from \"app/model/masterdata/Role\";\r\nimport ISynthesisInstrumentRepository from \"app/repository/SynthesisInstrumentRepository\";\r\nimport ICharacterizationInstrumentRepository from \"app/repository/CharacterizationInstrumentRepository\";\r\n\r\nexport default class PublicationMasterData implements IPublicMasterData {\r\n public get scienceDrivers() {\r\n return this._scienceDrivers;\r\n }\r\n\r\n public get journals() {\r\n return this._journals;\r\n }\r\n\r\n public get user() {\r\n return this._user;\r\n }\r\n\r\n public get characterizationInstruments(): ICharacterizationInstrument[] {\r\n return this._charInstruments;\r\n }\r\n public get synthesisInstruments(): ISynthesisInstrument[] {\r\n return this._synInstruments;\r\n }\r\n\r\n public get synthesisInstrumentTypes(): ISynthesisInstrumentType[] {\r\n return [];\r\n }\r\n\r\n public get synthesisTechniques(): ISynthesisTechnique[] {\r\n return [];\r\n }\r\n\r\n public getInstrumentsByTechnique(techniqueIds: string[]): ISynthesisInstrument[] {\r\n return [];\r\n }\r\n\r\n /**\r\n /**\r\n * Techniques for project level, using groups where available (Bulk)\r\n */\r\n public get projectSynthesisTechniques(): ISynthesisTechnique[] {\r\n return [];\r\n }\r\n /**\r\n * Growth techniques, excluding grouping like Bulk\r\n */\r\n public get sampleSynthesisTechniques() {\r\n return this._sampleSynTechniques;\r\n }\r\n\r\n public get characterizationTechniques() {\r\n return this._characterizationTechniques;\r\n }\r\n\r\n private _user: IUserManager;\r\n private _scienceDrivers: IScienceDriver[];\r\n\r\n private _sampleSynTechniques?: ISynthesisTechnique[];\r\n private _characterizationTechniques?: ICharacterizationTechnique[];\r\n private _synInstruments: ISynthesisInstrument[];\r\n private _charInstruments: ICharacterizationInstrument[];\r\n\r\n private _selectLists = new SelectListMap();\r\n private _journals: string[];\r\n public get roles(): IRole[] {\r\n return [];\r\n }\r\n private readonly _selectListRepo: ISelectListRepository;\r\n private readonly _publicationRepo: IPublicationRepository;\r\n private readonly _materialRepo: IMaterialRepository;\r\n private readonly _synTechniqueRepo: ISynthesisTechniqueRepository;\r\n private readonly _synInstrumentRepo: ISynthesisInstrumentRepository;\r\n private readonly _charTechniqueRepo: ICharacterizationTechniqueRepository;\r\n private readonly _charInstrumentRepo: ICharacterizationInstrumentRepository;\r\n\r\n private _materialsRegistry: IMaterialsRegistry;\r\n public get substrates(): () => Substrate[] {\r\n return this._materialsRegistry.substrates;\r\n }\r\n\r\n public get materials(): () => Material[] {\r\n return this._materialsRegistry.materials;\r\n }\r\n\r\n public constructor(\r\n charInstrumentRepo: ICharacterizationInstrumentRepository,\r\n charTechniqueRepo: ICharacterizationTechniqueRepository,\r\n materialRepo: IMaterialRepository,\r\n publicationRepo: IPublicationRepository,\r\n selectListRepo: ISelectListRepository,\r\n synInstrumentRepo: ISynthesisInstrumentRepository,\r\n synTechniqueRepo: ISynthesisTechniqueRepository,\r\n userManager: IUserManager\r\n ) {\r\n this._charInstrumentRepo = charInstrumentRepo;\r\n this._charTechniqueRepo = charTechniqueRepo;\r\n this._materialRepo = materialRepo;\r\n this._publicationRepo = publicationRepo;\r\n this._selectListRepo = selectListRepo;\r\n this._synInstrumentRepo = synInstrumentRepo;\r\n this._synTechniqueRepo = synTechniqueRepo;\r\n this._user = userManager;\r\n }\r\n\r\n /**\r\n * Get Label for enums defined in the database and loaded on startup.\r\n *\r\n */\r\n public getSelectLabel(listName: SelectList, key: TEnum): string | undefined {\r\n if (!key) {\r\n return undefined;\r\n }\r\n const list = this._selectLists.get(listName);\r\n if (list) {\r\n const entry = list.find((c) => c.key === key);\r\n return entry ? entry.value : undefined;\r\n } else {\r\n return undefined;\r\n }\r\n }\r\n\r\n public getSelectList(listName: SelectList): ISelectListEntry[] {\r\n return this._selectLists.get(listName);\r\n }\r\n\r\n public async updateJournals() {\r\n this._journals = await this._publicationRepo.getJournals();\r\n }\r\n\r\n public async load() {\r\n const promises = [\r\n this._publicationRepo.getScienceDrivers().then((r) => (this._scienceDrivers = r)),\r\n this._publicationRepo.getJournals().then((r) => (this._journals = r)),\r\n this._charTechniqueRepo.loadAll().then((r) => (this._characterizationTechniques = r)),\r\n this._synTechniqueRepo.loadAll().then((r) => this._setSynthesisTechniques(r)),\r\n this._charInstrumentRepo.loadAll().then((r) => (this._charInstruments = r)),\r\n this._synInstrumentRepo.loadAll().then((r) => (this._synInstruments = r)),\r\n MaterialsRegistry.load(this._materialRepo, null).then((result) => (this._materialsRegistry = result)),\r\n this._selectListRepo.get([SelectList.PublicationType]).then((result) => {\r\n this._selectLists.set(SelectList.PublicationType, result.publicationType);\r\n }),\r\n ] as const;\r\n await Promise.all(promises);\r\n }\r\n\r\n private _setSynthesisTechniques(techniques: ISynthesisTechnique[]) {\r\n // Those are groups, for growth, we need the parts of the group,\r\n // i.e. Bridgman, CVT, instead of just Bulk\r\n const groups = techniques.filter((t) => t.subTechniques.length > 0);\r\n\r\n // Those are normal techniques directly assigned.\r\n const ungrouped = techniques.filter((t) => t.subTechniques.length === 0 && !t.parentTechnique);\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n this._sampleSynTechniques = []\r\n .concat(ungrouped, ...groups.map((g) => g.subTechniques))\r\n .sort((s1: ISynthesisTechnique, s2: ISynthesisTechnique) => s1.name.localeCompare(s2.name));\r\n }\r\n\r\n public addNewSubstrate(s: Substrate) {\r\n this._materialsRegistry.addNewSubstrate(s);\r\n }\r\n public addMaterial(m: Material): void {\r\n this._materialsRegistry.addMaterial(m);\r\n }\r\n public getMaterialById(id: number): Material {\r\n return this._materialsRegistry.getMaterialById(id);\r\n }\r\n public getMaterialNames(ids: number[]): string {\r\n return this._materialsRegistry.getMaterialNames(ids);\r\n }\r\n}\r\n","import { Api, ApiRowMethods, Config, ConfigColumns } from \"datatables.net-bs\";\r\nimport \"datatables.net-responsive-bs\";\r\nimport $ from \"jquery\";\r\nimport ko from \"knockout\";\r\n\r\nimport Material from \"app/model/masterdata/Material\";\r\nimport { IPublication } from \"app/model/Publication\";\r\nimport IViewModelFactory from \"app/services/public/ViewModelFactory\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\nimport SearchByMaterial from \"../materialSearch/SearchByMaterial\";\r\nimport IScienceDriver from \"app/model/masterdata/ScienceDriver\";\r\nimport IProject from \"app/model/Project\";\r\nimport IPublicMasterData from \"app/services/public/IPublicMasterData\";\r\nimport { ISelectListEntry, SelectList } from \"app/model/masterdata/SelectList\";\r\nimport { PublicationType, Status } from \"app/model/Constants\";\r\n\r\nconst AUTHOR_EXPLANATION = `
  • Bold face is used to designate senior 2DCC faculty (core faculty and research professors that are professional staff in the facility)
  • \r\n
  • italic is used to designate senior local users not participating in in-house research
  • \r\n
  • underline is used to designate senior external users
`;\r\n\r\nexport default interface IPublicationTable {\r\n apiAccess: Api;\r\n\r\n reload(): void;\r\n setupTable(elem: JQuery): Promise;\r\n}\r\n\r\nexport class PublicationTable implements IPublicationTable {\r\n private _table: Api;\r\n public get apiAccess() {\r\n return this._table;\r\n }\r\n\r\n private readonly _remote: IRemoteServer;\r\n\r\n private readonly _masterData: IPublicMasterData;\r\n public get masterData() {\r\n return this._masterData;\r\n }\r\n\r\n private _loadFunction: (data: any, callback: any) => Promise;\r\n\r\n private readonly _materialSearch: SearchByMaterial;\r\n private readonly _viewModelFactory: IViewModelFactory;\r\n private readonly _scienceDrivers: IScienceDriver[];\r\n private readonly _publicationTypes: ISelectListEntry[];\r\n\r\n constructor(\r\n remote: IRemoteServer,\r\n masterData: IPublicMasterData,\r\n materialSearch: SearchByMaterial,\r\n viewmodelFactory: IViewModelFactory,\r\n loadFunction: (data: any, callback: any) => Promise\r\n ) {\r\n this._remote = remote;\r\n this._masterData = masterData;\r\n this._materialSearch = materialSearch;\r\n this._scienceDrivers = masterData.scienceDrivers;\r\n this._publicationTypes = masterData.getSelectList(SelectList.PublicationType);\r\n this._viewModelFactory = viewmodelFactory;\r\n this._loadFunction = loadFunction;\r\n }\r\n\r\n public reload(): void {\r\n this._table.one(\"draw\", () => this._table.columns.adjust()).draw(\"page\");\r\n }\r\n\r\n public async setupTable(elem: JQuery) {\r\n let table = elem.find(\"table\");\r\n\r\n while (table.get().length === 0) {\r\n await new Promise((resolve) => setTimeout(resolve, 50));\r\n table = elem.find(\"table\");\r\n }\r\n table = table.first();\r\n\r\n const columns: ConfigColumns[] = [\r\n {\r\n className: \"details-control\",\r\n orderable: false,\r\n data: undefined,\r\n defaultContent: \"\",\r\n render: () => \"\",\r\n },\r\n {\r\n data: \"authors\",\r\n },\r\n {\r\n data: \"title\",\r\n },\r\n {\r\n data: \"journal\",\r\n render: (data, type, row: IPublication) => this._renderJournalColumn(data, type, row),\r\n },\r\n { data: \"year\" },\r\n {\r\n data: \"materials\",\r\n searchable: false,\r\n render: (data: Material[], type) => this._renderMaterialColumn(data, type),\r\n },\r\n {\r\n data: \"type\",\r\n searchable: true,\r\n render: (data, type, model) => this._renderTypeColumn(data, type, model),\r\n },\r\n {\r\n data: \"scienceDriverIds\",\r\n searchable: false,\r\n render: (data, type) => this._renderScienceDriverColumn(data, type),\r\n },\r\n {\r\n data: \"isNew\",\r\n visible: false,\r\n defaultContent: \"\",\r\n },\r\n ];\r\n const settings: Config & { responsive: boolean } = {\r\n ajax: (data: any, callback: (data: any) => void) => {\r\n void this._loadFunction(data, callback);\r\n },\r\n lengthChange: false,\r\n columns,\r\n order: [\r\n [4, \"desc\"],\r\n [3, \"asc\"],\r\n ],\r\n layout: {\r\n topEnd: {\r\n search: {\r\n placeholder: \"by Author, Title, Journal\",\r\n },\r\n },\r\n },\r\n language: { search: \"Filter Publications\" },\r\n createdRow: (row, data, dataIndex) => {\r\n $(row).find(\"td:eq(1)\").attr(\"data-toggle\", \"tooltip\").attr(\"title\", AUTHOR_EXPLANATION);\r\n },\r\n searching: false,\r\n serverSide: true,\r\n responsive: true,\r\n };\r\n this._table = table.DataTable(settings);\r\n\r\n // JQuery requires using a this-pointer to the HTMLElement\r\n // Every access to this class's members has to be done via closure variables ...\r\n // eslint-disable-next-line @typescript-eslint/no-this-alias\r\n const that = this;\r\n const toggleDetail = this._toggleDetail.bind(this) as (\r\n tr: JQuery,\r\n icon: JQuery,\r\n row: ApiRowMethods\r\n ) => void;\r\n\r\n table\r\n .find(\"tbody\")\r\n .first()\r\n .on(\"click\", \"td.details-control\", function () {\r\n const tr = $(this).closest(\"tr\");\r\n const icon = tr.find(\"td:first\").find(\"i\");\r\n const row = that._table.row(tr);\r\n\r\n toggleDetail(tr, icon, row);\r\n });\r\n }\r\n\r\n public draw() {\r\n this._table.draw();\r\n }\r\n\r\n private _renderTypeColumn(data: PublicationType, type: string, model: IPublication): string {\r\n const projects = model.projects?.map((p) => this._getProjectRef(p, model.accessibleProjects)).join();\r\n if (type === \"display\") {\r\n const typeLabel = this._publicationTypes.find((t) => t.key === data)?.value;\r\n const typeRow = `${typeLabel}`;\r\n return typeRow + projects;\r\n } else {\r\n return projects;\r\n }\r\n }\r\n\r\n private _getProjectRef(project: IProject, accessibleProjects: number[]): string {\r\n const isAccessible = accessibleProjects.some((a) => a === project.id);\r\n if (!isAccessible) {\r\n return `
${project.projectLabel}`;\r\n }\r\n const link = this._remote.createRelativeUrl(`/Project?projectId=${project.projectLabel}`);\r\n return `
${project.projectLabel}`;\r\n }\r\n\r\n private _renderJournalColumn(data: string, type: string, model: IPublication): string {\r\n if (type === \"display\") {\r\n return model.doi ? `${data}` : data;\r\n } else {\r\n return data;\r\n }\r\n }\r\n\r\n private _renderScienceDriverColumn(data: number[], type: string): string {\r\n if (!data?.length) {\r\n return \"N/A\";\r\n }\r\n\r\n // keep order as returned by the server\r\n const values = data.map((id) => this._scienceDrivers.find((s) => s.id === id));\r\n\r\n const short = values.map((v) => v.name).join(\", \");\r\n const long = values.map((v) => v.label).join(\", \");\r\n\r\n if (type === \"display\") {\r\n return `${short}`;\r\n } else {\r\n return short;\r\n }\r\n }\r\n\r\n private _renderMaterialColumn(data: Material[], type: string): string {\r\n {\r\n if (type === \"display\") {\r\n const names = data.map((m) => {\r\n const vm = this._materialSearch.getMaterial(m.name);\r\n return vm ? vm.label : m.name;\r\n });\r\n const joined = names.join(\", \");\r\n return `${joined ? joined : \"non-specific\"}`;\r\n } else {\r\n return data.map((m) => m.name).join(\", \");\r\n }\r\n }\r\n }\r\n\r\n private _toggleDetail(tr: JQuery, icon: JQuery, row: ApiRowMethods): void {\r\n if (row.child.isShown()) {\r\n // This row is already open - close it\r\n row.child.hide();\r\n tr.removeClass(\"shown\");\r\n icon.attr(\"class\", \"fas fa-chevron-down\");\r\n } else {\r\n // Open this row\r\n const exists = row.child() !== undefined;\r\n if (!exists) {\r\n const detail = this._viewModelFactory.getPublicationDetail(row.data(), (modified: IPublication) => {\r\n this._updateRow(row, modified);\r\n });\r\n row.child(`
`);\r\n ko.applyBindings(detail, row.child()[0]);\r\n }\r\n row.child.show();\r\n tr.addClass(\"shown\");\r\n icon.attr(\"class\", \"fas fa-chevron-right\");\r\n }\r\n }\r\n\r\n private _updateRow(row: ApiRowMethods, updated: IPublication) {\r\n if (updated.status !== Status.Submitted) {\r\n row.child.hide();\r\n this._table.rows(row.index()).remove();\r\n } else {\r\n this._table.row(row.index()).data(updated);\r\n }\r\n this._table.draw(\"full-hold\");\r\n void this._masterData.updateJournals();\r\n }\r\n}\r\n","import { OrderArray } from \"datatables.net-bs\";\r\n\r\nimport { Operation, Privilege } from \"app/auth/AuthConstants\";\r\nimport { PublicationType, ReferencedMaterials } from \"app/model/Constants\";\r\nimport IScienceDriver from \"app/model/masterdata/ScienceDriver\";\r\nimport { ISelectListEntry, SelectList } from \"app/model/masterdata/SelectList\";\r\nimport IPublicMasterData from \"app/services/public/IPublicMasterData\";\r\nimport IViewModelFactory from \"app/services/public/ViewModelFactory\";\r\nimport IUserManager from \"app/services/user/UserManager\";\r\nimport ko from \"knockout\";\r\nimport { Observable, ObservableArray } from \"knockout\";\r\nimport ILoadableTab from \"../base/ILoadableTab\";\r\nimport IMainView from \"../base/IMainView\";\r\nimport { Tab } from \"../base/Tab\";\r\nimport ISearchByMaterial from \"../materialSearch/SearchByMaterial\";\r\nimport { PublicationTable } from \"./PublicationTable\";\r\nimport IPublicationRepository from \"app/repository/PublicationRepository\";\r\nimport IPublicationSearchCriteria from \"app/model/settings/IPublicationSearchCriteria\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\n\r\nexport default class PublicationTab extends Tab implements ILoadableTab {\r\n public get templateName() {\r\n return \"public/PublicationTab\";\r\n }\r\n public get url() {\r\n return \"publications\";\r\n }\r\n\r\n public tableVisible: Observable;\r\n public currentRow: unknown;\r\n private _materialFilter: ISearchByMaterial;\r\n\r\n public elements: ObservableArray = ko.observableArray();\r\n public materialIds: ObservableArray = ko.observableArray();\r\n public materialsDesc: Observable = ko.observable();\r\n\r\n public scienceDriver: Observable = ko.observable();\r\n public type: Observable = ko.observable();\r\n\r\n public searchText: Observable = ko.observable();\r\n public searching: Observable = ko.observable(false as boolean);\r\n\r\n public allScienceDrivers: ObservableArray = ko.observableArray();\r\n public allTypes: ObservableArray> = ko.observableArray();\r\n\r\n public showCreateButton: Observable = ko.observable(false as boolean);\r\n\r\n private readonly _table: PublicationTable;\r\n private readonly _publicationRepo: IPublicationRepository;\r\n\r\n private _initialized: (v: boolean) => void;\r\n private _initPromise: Promise = new Promise((resolve) => (this._initialized = resolve));\r\n\r\n private _mainView: IMainView;\r\n\r\n public async reload() {\r\n await this._initPromise;\r\n this._table.reload();\r\n }\r\n\r\n private _viewModelFactory: IViewModelFactory;\r\n\r\n constructor(\r\n remote: IRemoteServer,\r\n publicationRepo: IPublicationRepository,\r\n viewModelFactory: IViewModelFactory,\r\n masterData: IPublicMasterData,\r\n userManager: IUserManager,\r\n materialFilter: ISearchByMaterial,\r\n mainView: IMainView\r\n ) {\r\n super();\r\n this.title = \"Publications\";\r\n\r\n this.currentRow = {};\r\n this._publicationRepo = publicationRepo;\r\n this._viewModelFactory = viewModelFactory;\r\n this._table = new PublicationTable(remote, masterData, materialFilter, viewModelFactory, this._loadData.bind(this));\r\n this._materialFilter = materialFilter;\r\n this._mainView = mainView;\r\n\r\n // public variables, i.e. references by the view.\r\n this.tableVisible = ko.observable(true as boolean);\r\n\r\n this.scienceDriver.subscribe(() => {\r\n void this.reload();\r\n });\r\n this.type.subscribe(() => {\r\n void this.reload();\r\n });\r\n this.searchText.subscribe(() => {\r\n void this.reload();\r\n });\r\n\r\n this.allScienceDrivers(masterData.scienceDrivers);\r\n this.allTypes(masterData.getSelectList(SelectList.PublicationType));\r\n this.showCreateButton(userManager.isAuthorized(Privilege.Publication, Operation.Create));\r\n }\r\n\r\n /**\r\n * Initialize this table.\r\n * Since this can be async, store the promise once it has been started.\r\n * A possible second request can then just await the promise.\r\n */\r\n public async init(elem: JQuery) {\r\n await this._table.setupTable(elem);\r\n this._initialized(true);\r\n }\r\n\r\n public async openMaterialsPopup() {\r\n try {\r\n await this._materialFilter.init(ReferencedMaterials.Publication, this.materialIds());\r\n const filtered = await this._mainView.openPopup(this._materialFilter);\r\n\r\n this.materialIds(filtered.materials && filtered.materials.length > 0 ? filtered.materials.map((m) => m.id) : []);\r\n this.elements(filtered.elements.map((e) => e.name));\r\n this.materialsDesc(filtered.selection);\r\n return this.reload();\r\n } catch (error) {\r\n this._mainView.showError(error);\r\n }\r\n }\r\n\r\n public resetMaterialFilter() {\r\n this.materialIds([]);\r\n this.elements([]);\r\n this.materialsDesc(\"\");\r\n void this.reload();\r\n }\r\n\r\n public resetSearch(): void {\r\n this.scienceDriver(null);\r\n this.type(null);\r\n this.materialIds([]);\r\n this.elements([]);\r\n this.searchText(null);\r\n }\r\n\r\n // // Filter the rows: Only show rows when the material is not hidden\r\n // // and it is either selected or no material has been selected at all (i.e. show all)\r\n // public applyFilter(settings: any, data: any[], dataIndex: any, pub: Publication) {\r\n // // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\r\n // if (settings.nTable?.id !== \"publication-table\") {\r\n // // This filter function is set to all datatable instances ...\r\n // // So we have to make sure to ignore it if we are not inside the publication table\r\n // return true;\r\n // }\r\n\r\n // const materialFilter =\r\n // this._materialFilter.getSelectedMaterials().length === 0 ||\r\n // pub.materials.length === 0 ||\r\n // pub.materials.some((m) => this._materialFilter.getSelectedMaterials().some((active) => active.name === m.name));\r\n\r\n // return (\r\n // materialFilter &&\r\n // (!this.scienceDriver() || pub.scienceDrivers.some((sd) => sd === this.scienceDriver())) &&\r\n // (!this.type() || this.type() === pub.type)\r\n // );\r\n // }\r\n\r\n public getSearchParams(): IPublicationSearchCriteria {\r\n return {\r\n elements: this.elements(),\r\n materials: this.materialIds(),\r\n searchText: this.searchText(),\r\n publicationType: this.type(),\r\n scienceDriver: this.scienceDriver(),\r\n };\r\n }\r\n\r\n private async _loadData(data: any, callback: (data: any) => void) {\r\n this.searching(true);\r\n /* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n /* eslint-disable @typescript-eslint/no-unsafe-member-access */\r\n const sortIndex = data.order[0]?.column;\r\n\r\n try {\r\n const criteria = this.getSearchParams();\r\n const dataPackages = await this._publicationRepo.search(\r\n criteria,\r\n // The datatables plugin only gives the column number (sortIndex).\r\n // Since the table is configured here and only here, this is the place to\r\n // translate it into a column name\r\n // The backend does not care about the table presentation.\r\n data.columns[sortIndex]?.data,\r\n data.order[0]?.dir === \"desc\" ? \"Desc\" : \"Asc\",\r\n data.start,\r\n data.length,\r\n data.draw\r\n );\r\n callback(dataPackages);\r\n } catch (remoteError) {\r\n this._mainView.showError(remoteError);\r\n } finally {\r\n this.searching(false);\r\n }\r\n }\r\n\r\n public isDirty() {\r\n // TODO - Make sure that unsaved changes are not lost.\r\n return false;\r\n }\r\n\r\n public async createPublication() {\r\n const publication = await this._viewModelFactory.openPublicationEditor(undefined);\r\n if (publication) {\r\n this._table.apiAccess.row.add(publication);\r\n // Adapt the sorting, so that new publications are shown on top.\r\n const currentOrder: OrderArray[] = this._table.apiAccess.order();\r\n // That is the column \"isNew\"\r\n const newOrderItem: OrderArray = [8, \"desc\"];\r\n const newOrder: OrderArray[] = [newOrderItem].concat(currentOrder);\r\n this._table.apiAccess.order(newOrder).draw();\r\n }\r\n }\r\n}\r\n","import { ReferencedMaterials, ShippingFilter } from \"app/model/Constants\";\r\nimport CharacterizationTechnique from \"app/model/masterdata/CharacterizationTechnique\";\r\nimport ISynthesisTechnique from \"app/model/masterdata/SynthesisTechnique\";\r\nimport ISampleSearchCriteria from \"app/model/settings/ISampleSearchCriteria\";\r\nimport ISampleStatisticsRepository from \"app/repository/SampleStatisticsRepository\";\r\nimport IPublicMasterData from \"app/services/public/IPublicMasterData\";\r\nimport ko, { ObservableArray } from \"knockout\";\r\nimport { Observable } from \"knockout\";\r\nimport ILoadableTab from \"../base/ILoadableTab\";\r\nimport IMainView from \"../base/IMainView\";\r\nimport { Tab } from \"../base/Tab\";\r\nimport ISearchByMaterial from \"../materialSearch/SearchByMaterial\";\r\nimport SampleStatTable from \"./SampleStatTable\";\r\n\r\nexport default class SampleStatTab extends Tab implements ILoadableTab {\r\n public get templateName() {\r\n return \"public/SampleStatTab\";\r\n }\r\n\r\n public get url() {\r\n return \"sampleMetaData\";\r\n }\r\n\r\n public allSynTechniques: ISynthesisTechnique[];\r\n public allCharTechniques: CharacterizationTechnique[];\r\n\r\n public synTechnique: Observable = ko.observable();\r\n public charTechnique: Observable = ko.observable();\r\n\r\n public elements: ObservableArray = ko.observableArray();\r\n public materialIds: ObservableArray = ko.observableArray();\r\n public materialsDesc: Observable = ko.observable();\r\n\r\n public searching: Observable = ko.observable();\r\n\r\n private _table: SampleStatTable;\r\n\r\n private _initialized: (v: boolean) => void;\r\n private _initPromise: Promise = new Promise((resolve) => (this._initialized = resolve));\r\n\r\n private readonly _mainView: IMainView;\r\n private readonly _materialFilter: ISearchByMaterial;\r\n private readonly _sampleStatRepo: ISampleStatisticsRepository;\r\n\r\n public constructor(\r\n table: SampleStatTable,\r\n masterData: IPublicMasterData,\r\n mainData: IMainView,\r\n materialFilter: ISearchByMaterial,\r\n sampleStatRepo: ISampleStatisticsRepository\r\n ) {\r\n super();\r\n this.title = \"Sample Metadata\";\r\n\r\n this._table = table;\r\n\r\n this._materialFilter = materialFilter;\r\n this._mainView = mainData;\r\n this._sampleStatRepo = sampleStatRepo;\r\n this.allSynTechniques = masterData.sampleSynthesisTechniques;\r\n this.allCharTechniques = masterData.characterizationTechniques;\r\n }\r\n\r\n /**\r\n * Initialize this table.\r\n * Since this can be async, store the promise once it has been started.\r\n * A possible second request can then just await the promise.\r\n */\r\n public async init(elem: JQuery) {\r\n try {\r\n await this._table.setupTable(elem);\r\n this._initialized(true);\r\n } catch (error) {\r\n this._mainView.showError(error);\r\n }\r\n }\r\n\r\n public async reload() {\r\n return this.search();\r\n }\r\n\r\n public async search() {\r\n await this._initPromise;\r\n this.searching(true);\r\n this._table.apiAccess.clear();\r\n this._table.apiAccess.draw();\r\n try {\r\n const criteria = this.getSearchParams();\r\n const sampleStat = await this._sampleStatRepo.getStats(criteria);\r\n this._table.showData(sampleStat);\r\n } catch (remoteError) {\r\n this._mainView.showError(remoteError);\r\n } finally {\r\n this.searching(false);\r\n }\r\n }\r\n\r\n public async openMaterialsPopup() {\r\n try {\r\n await this._materialFilter.init(ReferencedMaterials.Sample, this.materialIds());\r\n const filtered = await this._mainView.openPopup(this._materialFilter);\r\n\r\n this.materialIds(filtered.materials && filtered.materials.length > 0 ? filtered.materials.map((m) => m.id) : []);\r\n this.elements(filtered.elements.map((e) => e.name));\r\n this.materialsDesc(filtered.selection);\r\n } catch (error) {\r\n this._mainView.showError(error);\r\n }\r\n }\r\n\r\n public resetMaterialFilter() {\r\n this.materialIds([]);\r\n this.elements([]);\r\n this.materialsDesc(\"\");\r\n }\r\n\r\n public getSearchParams(): ISampleSearchCriteria {\r\n return {\r\n description: undefined,\r\n elements: this.elements(),\r\n includeFinalized: true,\r\n includeSplitPieces: true,\r\n materials: this.materialIds(),\r\n shipped: ShippingFilter.Any,\r\n techniqueId: this.synTechnique(),\r\n withCharacterization: this.charTechnique(),\r\n };\r\n }\r\n}\r\n","import ISampleStatistics from \"app/model/report/SampleStatistics\";\r\nimport ISampleSearchCriteria from \"app/model/settings/ISampleSearchCriteria\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\nimport BaseControllerRepository from \"./BaseControllerRepository\";\r\n\r\nexport default interface ISampleStatisticsRepository {\r\n getStats(criteria: ISampleSearchCriteria): Promise;\r\n}\r\n\r\nexport class SampleStatisticsRepository extends BaseControllerRepository implements ISampleStatisticsRepository {\r\n\r\n constructor(remote: IRemoteServer) {\r\n super(\"v1\", \"sample-stat\", remote);\r\n }\r\n\r\n public async getStats(criteria: ISampleSearchCriteria): Promise {\r\n return this.remotePostAny(criteria, \"\");\r\n }\r\n\r\n}","import { Api, ConfigColumns } from \"datatables.net-bs\";\r\n\r\n\r\nimport ICharacterizationTechnique from \"app/model/masterdata/CharacterizationTechnique\";\r\nimport ISampleStatistics from \"app/model/report/SampleStatistics\";\r\nimport IPublicMasterData from \"app/services/public/IPublicMasterData\";\r\nimport IUserManager from \"app/services/user/UserManager\";\r\n\r\nexport default class SampleStatTable {\r\n private _table: Api;\r\n public get apiAccess() {\r\n return this._table;\r\n }\r\n\r\n private _masterData: IPublicMasterData;\r\n private _userManager: IUserManager;\r\n private _charTechniques: ICharacterizationTechnique[];\r\n\r\n public constructor(masterData: IPublicMasterData, userManager: IUserManager) {\r\n this._charTechniques = masterData.characterizationTechniques;\r\n this._masterData = masterData;\r\n this._userManager = userManager;\r\n }\r\n\r\n public async setupTable(elem: JQuery) {\r\n let table = elem.find(\"table\");\r\n\r\n while (table.get().length === 0) {\r\n await new Promise((resolve) => setTimeout(resolve, 50));\r\n table = elem.find(\"table\");\r\n }\r\n table = table.first();\r\n\r\n const columns: ConfigColumns[] = [\r\n { data: \"count\" },\r\n {\r\n render: (data, type, row: ISampleStatistics) => this._renderMaterialColumn(row, type)\r\n },\r\n { data: \"technique\" },\r\n {\r\n data: \"faculty\",\r\n render: (data, type) => this._renderContactColumn(data, type)\r\n }\r\n ]\r\n this._charTechniques.forEach(c => {\r\n columns.push(\r\n { render: (data, type, row: ISampleStatistics) => this._renderStats(c.id, row, type) },\r\n )\r\n });\r\n this._table = table.DataTable({\r\n searching: false,\r\n lengthChange: false,\r\n columns,\r\n data: [],\r\n order: [[0, \"desc\"], [1, \"asc\"]],\r\n });\r\n }\r\n\r\n public showData(sampleStat: ISampleStatistics[]) {\r\n this._table.clear();\r\n this._table.rows.add(sampleStat);\r\n this._table.draw();\r\n }\r\n\r\n private _renderStats(key: string, row: ISampleStatistics, type: string): number {\r\n return row.characterizations.find(c => c.id === key)?.count ?? 0;\r\n }\r\n\r\n private _renderMaterialColumn(row: ISampleStatistics, type: string): string {\r\n {\r\n if (!row.materialIds?.length) {\r\n return \"Not set\";\r\n }\r\n if (type === \"display\") {\r\n const names = row.materialIds.map((id) => {\r\n const vm = this._masterData.getMaterialById(id)\r\n return vm ? vm.label : id;\r\n });\r\n const joined = names.join(\"
, \");\r\n return `${joined ? joined : \"not set\"}`;\r\n } else {\r\n return \"unknown\";\r\n }\r\n }\r\n }\r\n\r\n private _renderContactColumn(data: string, type: string): string {\r\n if (!data) {\r\n return \"Not set\";\r\n }\r\n const fullName = this._userManager.getFullNames(data);\r\n if (type === \"display\") {\r\n return `${fullName}`;\r\n } else {\r\n return fullName;\r\n }\r\n }\r\n\r\n}\r\n","import ko from \"knockout\";\r\n\r\nimport PublicMainVM, { PublicationTabType } from \"app/PublicMainVM\";\r\nimport { MaterialRepository } from \"app/repository/MaterialRepository\";\r\nimport { PublicationRepository } from \"app/repository/PublicationRepository\";\r\nimport ElementsMap from \"app/viewModel/materialSearch/ElementMap\";\r\nimport MaterialMap from \"app/viewModel/materialSearch/MaterialMap\";\r\nimport { SearchByMaterial } from \"app/viewModel/materialSearch/SearchByMaterial\";\r\nimport RemoteServer from \"../remote/RemoteServer\";\r\nimport { ViewModelFactory } from \"./ViewModelFactory\";\r\nimport { CollaboratorRepository } from \"app/repository/CollaboratorRepository\";\r\nimport { ProjectRepository } from \"app/repository/ProjectRepository\";\r\nimport PublicMasterData from \"./PublicMasterData\";\r\nimport { SelectListRepository } from \"app/repository/SelectListRepository\";\r\nimport { UserManager } from \"../user/UserManager\";\r\nimport SignInAsPopup from \"app/viewModel/popup/SignInAsPopup\";\r\nimport PublicationTab from \"app/viewModel/public/PublicationTab\";\r\nimport SampleStatTab from \"app/viewModel/public/SampleStatTab\";\r\nimport { CharacterizationTechniqueRepository } from \"app/repository/CharacterizationTechniqueRepository\";\r\nimport { SynthesisTechniqueRepository } from \"app/repository/SynthesisTechniqueRepository\";\r\nimport { SampleStatisticsRepository } from \"app/repository/SampleStatisticsRepository\";\r\nimport SampleStatTable from \"app/viewModel/public/SampleStatTable\";\r\nimport { Privilege } from \"app/auth/AuthConstants\";\r\nimport IRemoteServer from \"../remote/IRemoteServer\";\r\nimport { ReferencedMaterials } from \"app/model/Constants\";\r\nimport { CharacterizationInstrumentRepository } from \"app/repository/CharacterizationInstrumentRepository\";\r\nimport { SynthesisInstrumentRepository } from \"app/repository/SynthesisInstrumentRepository\";\r\n\r\nexport default class CompositionRoot {\r\n public static async setUpApplication() {\r\n const remote = new RemoteServer();\r\n\r\n const charInstrumentRepo = new CharacterizationInstrumentRepository(remote);\r\n const charTechniqueRepo = new CharacterizationTechniqueRepository(remote);\r\n const collaboratorRepo = new CollaboratorRepository(remote);\r\n const materialRepo = new MaterialRepository(remote);\r\n const projectRepo = new ProjectRepository(remote);\r\n const publicationRepo = new PublicationRepository(remote);\r\n const sampleStatRepo = new SampleStatisticsRepository(remote);\r\n const synInstrumentRepo = new SynthesisInstrumentRepository(remote);\r\n const synTechniqueRepo = new SynthesisTechniqueRepository(remote);\r\n const selectListRepo = new SelectListRepository(remote);\r\n\r\n const materialsVM = new MaterialMap(materialRepo);\r\n const elementsVM = new ElementsMap();\r\n const materialFilter = new SearchByMaterial(materialsVM, elementsVM);\r\n\r\n const mainView = new PublicMainVM(remote);\r\n ko.applyBindings(mainView);\r\n\r\n const signInAsPopup = new SignInAsPopup(mainView, collaboratorRepo);\r\n const userManager = new UserManager(collaboratorRepo, projectRepo, mainView, signInAsPopup);\r\n const masterData = new PublicMasterData(\r\n charInstrumentRepo,\r\n charTechniqueRepo,\r\n materialRepo,\r\n publicationRepo,\r\n selectListRepo,\r\n synInstrumentRepo,\r\n synTechniqueRepo,\r\n userManager\r\n );\r\n\r\n try {\r\n await Promise.all([userManager.load(), masterData.load(), materialFilter.init(ReferencedMaterials.Publication)]);\r\n mainView.user = userManager;\r\n mainView.setInitialized();\r\n ko.tasks.runEarly();\r\n\r\n const viewModelFactory = new ViewModelFactory(\r\n remote,\r\n publicationRepo,\r\n projectRepo,\r\n materialRepo,\r\n mainView,\r\n masterData,\r\n userManager\r\n );\r\n\r\n // Requested, but not authorized. Enforce login if anonymous, if a user is logged in and can't see that,\r\n // just ignore that request and show the publications\r\n const initialTabName = this.getInitialTab(remote);\r\n if (\r\n initialTabName === \"sampleMetaData\" &&\r\n !userManager.isAuthorized(Privilege.SampleStatistics) &&\r\n userManager.isAnonymous\r\n ) {\r\n const newUrl = remote.getForwardUrlWithLogin();\r\n window.location.href = newUrl;\r\n return mainView;\r\n }\r\n\r\n const publicationTab = new PublicationTab(\r\n remote,\r\n publicationRepo,\r\n viewModelFactory,\r\n masterData,\r\n userManager,\r\n materialFilter,\r\n mainView\r\n );\r\n mainView.addTab(publicationTab);\r\n\r\n let sampleStatTab: PublicationTabType;\r\n if (userManager.isAuthorized(Privilege.SampleStatistics)) {\r\n const sampleStatTable = new SampleStatTable(masterData, userManager);\r\n sampleStatTab = new SampleStatTab(sampleStatTable, masterData, mainView, materialFilter, sampleStatRepo);\r\n mainView.addTab(sampleStatTab);\r\n } else {\r\n sampleStatTab = undefined;\r\n }\r\n\r\n await mainView.selectTab(initialTabName === \"sampleMetaData\" && sampleStatTab ? sampleStatTab : publicationTab);\r\n return mainView;\r\n } catch (error) {\r\n alert(error);\r\n throw error;\r\n }\r\n }\r\n\r\n public static getInitialTab(remote: IRemoteServer): \"publications\" | \"sampleMetaData\" {\r\n if (window.location.pathname.toLowerCase().endsWith(\"publications\") ?? remote.getQueryVariable(\"publications\")) {\r\n return \"publications\";\r\n }\r\n if (window.location.pathname.toLowerCase().endsWith(\"samplemetadata\") ?? remote.getQueryVariable(\"samples\")) {\r\n return \"sampleMetaData\";\r\n }\r\n return \"sampleMetaData\";\r\n }\r\n}\r\n","import \"bootswatch/paper/bootstrap.css\";\r\nimport \"datatables.net-bs/css/dataTables.bootstrap.css\";\r\nimport \"datatables.net-responsive-bs/css/responsive.bootstrap.css\";\r\n\r\nimport \"summernote/summernote.css\";\r\nimport \"select2/dist/css/select2.css\";\r\nimport \"select2-bootstrap-theme/dist/select2-bootstrap.css\";\r\nimport \"core-js/stable\";\r\nimport \"regenerator-runtime/runtime\";\r\n\r\n\r\nimport \"css/loader.css\";\r\nimport \"css/modals.css\";\r\nimport \"css/site.css\";\r\nimport \"css/materialSelection.css\";\r\nimport \"css/publication.css\";\r\nimport \"css/highconstrast.css\";\r\n\r\n\r\n\r\nimport \"bootstrap\";\r\nimport $ from \"jquery\";\r\nimport ko from \"knockout\";\r\nimport \"knockout.validation\";\r\n\r\n\r\nimport initKoExtensions from \"ext/knockout-extension\";\r\nimport initLogging from \"ext/logging\";\r\nimport initSelect2 from \"ext/knockout-extensions/select2\";\r\nimport initSummerNote from \"ext/knockout-extensions/summernote\";\r\nimport initDatePicker from \"ext/knockout-extensions/knockout-datepicker\";\r\n\r\nimport CompositionRoot from \"./services/public/CompositionRoot\";\r\n\r\n$(() => {\r\n ko.options.deferUpdates = true;\r\n ko.validation.init({\r\n decorateInputElement: true,\r\n errorClass: \"has-error\",\r\n errorElementClass: \"has-error\",\r\n grouping: {\r\n deep: true,\r\n live: true,\r\n observable: true\r\n },\r\n messagesOnModified: true,\r\n });\r\n initKoExtensions();\r\n initSelect2();\r\n initSummerNote();\r\n initLogging();\r\n initDatePicker();\r\n $(document).on(\"mouseenter\", '[data-toggle=\"tooltip\"]', function () {\r\n $(this).tooltip({\r\n html: true,\r\n container: 'body',\r\n // trigger: \"manual\", // Set trigger to manual to control tooltip visibility programmatically\r\n // delay: { show: 500, hide: 10000 }, // Adjust show and hide delays as needed (in milliseconds)\r\n placement: function (tooltip, element) {\r\n const $element = $(element);\r\n const elementTop = $element.offset().top;\r\n const elementBottom = elementTop + $element.outerHeight();\r\n const viewportTop = $(window).scrollTop();\r\n const viewportBottom = viewportTop + $(window).height();\r\n\r\n // Determine placement based on available space\r\n if (elementTop - viewportTop > viewportBottom - elementBottom) {\r\n return \"top\";\r\n } else {\r\n return \"bottom\";\r\n }\r\n },\r\n });\r\n });\r\n\r\n\r\n CompositionRoot.setUpApplication()\r\n .then(viewModel => {\r\n window.addEventListener(\"beforeunload\", (e) => {\r\n if (viewModel.isDirty()) {\r\n e.returnValue = \"o\"; // Gecko and Trident\r\n e.preventDefault();\r\n }\r\n });\r\n })\r\n .catch((error) => {\r\n // CompositionRoot catches and shows via mainView.showError if possible.\r\n // Here we should only get fatal errors, when the whole application cannot be set up.\r\n alert(error);\r\n throw (error);\r\n });\r\n});\r\n","export enum Privilege {\r\n UserProject = \"UserProject\",\r\n InternalProject = \"InternalProject\",\r\n AccessUnpublishedData = \"AccessUnpublishedData\",\r\n AccessPendingProject = \"AccessPendingProject\",\r\n\r\n ProjectDecision = \"ProjectDecision\",\r\n ProjectDocument = \"ProjectDocument\",\r\n Proposal = \"Proposal\",\r\n Report = \"Report\",\r\n Publication = \"Publication\",\r\n Communication = \"Communication\",\r\n OwnCommunication = \"OwnCommunication\",\r\n SampleRequest = \"SampleRequest\",\r\n SamplesDue = \"SamplesDue\",\r\n\r\n Sample = \"Sample\",\r\n AccessProcessDevelopmentSample = \"AccessProcessDevelopmentSample\",\r\n AccessAllPendingSamples = \"AccessPendingSample\",\r\n CreateSampleForOthers = \"CreateSampleForOthers\",\r\n\r\n ProcessingActivity = \"ProcessingActivity\",\r\n SplitActivity = \"SplitActivity\",\r\n CharacterizationActivity = \"CharacterizationActivity\",\r\n TransferActivity = \"TransferActivity\",\r\n StorageActivity = \"StorageActivity\",\r\n TheoryActivity = \"TheoryActivity\",\r\n // Shipping Privilege uses \"Execute\" Right for the actual sending out, \r\n // Create&Update determine who can request the shipping (create/update the shipping request)\r\n Shipping = \"Shipping\",\r\n\r\n Note = \"Note\",\r\n OwnNote = \"OwnNote\",\r\n File = \"File\",\r\n OwnFile = \"OwnFile\",\r\n CharacterizationData = \"CharacterizationData\",\r\n OwnCharacterizationData = \"OwnCharacterizationData\",\r\n ConfigureFileMetaData = \"ConfigureFileMetaData\",\r\n RecipeFavorite = \"RecipeFavorite\",\r\n\r\n // Customizing\r\n Role = \"Role\",\r\n User = \"User\",\r\n // Users belonging to the same Research Group\r\n ResearchGroup = \"ResearchGroup\",\r\n\r\n SynthesisTechnique = \"SynthesisTechnique\",\r\n /// \r\n /// Gives users the right to work with any synthesis technique, \r\n /// where operations are restricted to assigned techniques.\r\n /// E.g.reports, creating instruments, etc.\r\n /// Without that privilege, only users assigned to a technique can do such things.\r\n /// \r\n UseAnySynthesisTechnique = \"UseAnySynthesisTechnique\",\r\n\r\n SynthesisInstrument = \"SynthesisInstrument\",\r\n /// \r\n /// Gives users the right to work with any synthesis instrument, \r\n /// where operations are restricted to assigned techniques (aka managed instruments).\r\n /// Currently only used for customizing instruments\r\n /// Without that privilege, only a user whould have to be an instrument manager to customize an instrument.\r\n /// \r\n UseAnySynthesisInstrument = \"UseAnySynthesisInstrument\",\r\n\r\n SetInstrumentManager = \"SetInstrumentManager\",\r\n\r\n CharacterizationTechnique = \"CharacterizationTechnique\",\r\n CharacterizationInstrument = \"CharacterizationInstrument\",\r\n SimulationMethod = \"SimulationMethod\",\r\n Material = \"Material\",\r\n ConfidentialMaterial = \"ConfidentialMaterial\",\r\n Substrate = \"Substrate\",\r\n BulkRawMaterial = \"BulkRawMaterial\",\r\n\r\n SampleReport = \"SampleReport\",\r\n SampleImport = \"SampleImport\",\r\n CharacterizationUpload = \"CharacterizationUpload\",\r\n ImportMonitoring = \"ImportMonitoring\",\r\n AutoSubmit = \"AutoSubmit\",\r\n\r\n DataPackage = \"DataPackage\",\r\n\r\n AccessVisibilityInternal = \"AccessVisibilityInternal\",\r\n AccessVisibilityUser = \"AccessVisibilityUser\",\r\n AccessVisibilityPublic = \"AccessVisibilityPublic\",\r\n\r\n AccessBudgetData = \"AccessBudgetData\",\r\n AccessInstrumentDetails = \"AccessInstrumentDetails\",\r\n DownloadRecipe = \"DownloadRecipe\",\r\n SignInAs = \"SignInAs\",\r\n SampleStatistics = \"SampleStatistics\",\r\n\r\n ApiKeys = \"ApiKeys\",\r\n}\r\n\r\nexport enum Operation {\r\n Create = \"c\",\r\n Read = \"r\",\r\n Update = \"u\",\r\n Delete = \"d\",\r\n Submit = \"s\",\r\n ResetToPending = \"p\",\r\n Execute = \"x\",\r\n List = \"l\"\r\n}\r\n\r\n/**\r\n * Special roles shown on the project page itself, not on the collaborators page\r\n */\r\nexport enum Role {\r\n Community = 1,\r\n /** The PI, one per project. Other users can be added as collaborators. */\r\n ProjectUserPI = 2,\r\n /** 2DCC Faculty assigned to a project */\r\n ProjectFaculty = 3,\r\n /** 2DCC Staff assigned to a project */\r\n ProjectStaff = 4,\r\n}\r\n","import {Material} from \"app/model/masterdata/Material\";\r\nimport ISubstrate, {Substrate} from \"app/model/Substrate\";\r\nimport IMaterialRepository from \"app/repository/MaterialRepository\";\r\nimport ISubstrateRepository from \"app/repository/SubstrateRepository\";\r\nimport ko from \"knockout\";\r\nimport { ObservableArray } from \"knockout\";\r\n\r\nexport default interface IMaterialsRegistry {\r\n substrates: () => Substrate[];\r\n addNewSubstrate(s: Substrate): void;\r\n\r\n materials: () => Material[];\r\n addMaterial(m: Material): void;\r\n getMaterialById(id: number): Material;\r\n getMaterialNames(ids: number[]): string;\r\n}\r\n\r\nexport class MaterialsRegistry implements IMaterialsRegistry {\r\n private _substrates: ObservableArray = ko.observableArray();\r\n private _materials?: ObservableArray = ko.observableArray();\r\n private _materialMap?: Map;\r\n\r\n public constructor(data: Material[], substrates: ISubstrate[]) {\r\n data.sort(\r\n (a, b) => a.name.localeCompare(b.name),\r\n );\r\n this._materials(data);\r\n this._materialMap = Material.createMap(data);\r\n this._substrates(substrates.map((s) => new Substrate(s)));\r\n }\r\n\r\n public get materials() {\r\n return this._materials;\r\n }\r\n\r\n public get substrates() {\r\n return this._substrates;\r\n }\r\n\r\n public addNewSubstrate(s: Substrate) {\r\n this._substrates.push(s);\r\n }\r\n\r\n public getMaterialById(id: number): Material {\r\n return this._materialMap.get(id);\r\n }\r\n\r\n public addMaterial(m: Material) {\r\n this._materials.push(m);\r\n this._materialMap.set(m.id, m);\r\n }\r\n\r\n\r\n public getMaterialNames(data: number | number[]): string {\r\n if (!data) {\r\n return \"tbd\";\r\n }\r\n const ids: number[] = Array.isArray(data) ? data : [data];\r\n return ids\r\n .map((id) => this._materialMap.get(id)?.label ?? \"?\")\r\n .join(\", \");\r\n }\r\n\r\n public static async load(materialRepo: IMaterialRepository, substrateRepo: ISubstrateRepository): Promise {\r\n const [\r\n materials, \r\n substrates\r\n ] = await Promise.all([\r\n materialRepo.loadAll(),\r\n substrateRepo?.loadAll() ?? Promise.resolve([])\r\n ]);\r\n return new MaterialsRegistry(materials, substrates);\r\n }\r\n}","export default function ArrayComparer(a: any[], b: any[]) {\r\n if (!a && !b) {\r\n return true;\r\n }\r\n if (!a && b || a && !b) {\r\n return false;\r\n }\r\n return a.length === b.length && a.every((item) => b.includes(item));\r\n}\r\n","import { Moment } from \"moment\";\r\n\r\n\r\nexport function deserializeDateTime(param: string): Date {\r\n return param ? new Date(param) : null;\r\n}\r\n\r\nexport function formatDate(date: Date | Moment, format: IDateFormat = DateFormat.dateOnly): string {\r\n if (!date) {\r\n return format.formatter.format(new Date());\r\n }\r\n return date instanceof Date ? format.formatter.format(date) : date.format(format.formatString);\r\n}\r\n\r\ninterface IDateFormat {\r\n formatString: string;\r\n formatter: Intl.DateTimeFormat;\r\n}\r\n\r\nexport class DateFormat {\r\n static dateOnly: IDateFormat = {\r\n formatString: \"DD/MM/YYYY\",\r\n formatter: new Intl.DateTimeFormat(\"en-US\", {\r\n // Customize based on your desired locale\r\n year: \"numeric\",\r\n month: \"numeric\",\r\n day: \"numeric\",\r\n }),\r\n };\r\n\r\n static dateTime: IDateFormat = {\r\n formatString: \"MM/DD/YYYY hh:mm a\",\r\n formatter: new Intl.DateTimeFormat(\"en-US\", {\r\n // Customize based on your desired locale\r\n year: \"numeric\",\r\n month: \"numeric\",\r\n day: \"numeric\",\r\n hour: \"2-digit\",\r\n hour12: true,\r\n minute: \"2-digit\",\r\n\r\n }),\r\n };\r\n}\r\n","export default function DownloadHelper(data: any, filename: string) {\r\n const blob = new Blob([data]);\r\n const link = document.createElement(\"a\");\r\n link.href = window.URL.createObjectURL(blob);\r\n link.download = filename;\r\n link.click();\r\n}\r\n","import ISynthesisInstrument from \"app/model/masterdata/SynthesisInstrument\";\r\nimport ISynthesisTechnique from \"app/model/masterdata/SynthesisTechnique\";\r\n\r\nexport default class SynthesisInstrumentHelper {\r\n\r\n public static getInstrumentsByTechnique(\r\n allInstruments: ISynthesisInstrument[],\r\n allTechniques: ISynthesisTechnique[],\r\n techniqueIds: string[]) {\r\n if (techniqueIds.length === 0 || techniqueIds.every(t => !t)) {\r\n return allInstruments;\r\n }\r\n const searchTechniques =\r\n techniqueIds.map((t) => allTechniques.find((s) => s.id === t))\r\n .concat(\r\n ...techniqueIds\r\n .map((t) => allTechniques.find((s) => s.id === t)?.subTechniques)\r\n );\r\n\r\n return allInstruments.filter(\r\n (i) => i.synthesisTechniques.some(instrumentTechnique => searchTechniques.some(st => st.id === instrumentTechnique)))\r\n }\r\n}","import { ISelectListEntry } from \"./masterdata/SelectList\";\r\nexport enum Status {\r\n Submitted = \"S\",\r\n Pending = \"P\",\r\n New = \"N\",\r\n Deleted = \"D\",\r\n /** Snapshots for publications. They are read only */\r\n Published = \"R\"\r\n}\r\n\r\nexport enum RequestStatus {\r\n Open = \"O\",\r\n InProcess = \"P\",\r\n Shipped = \"S\",\r\n Postponed = \"L\",\r\n Cancelled = \"C\",\r\n}\r\n\r\nexport enum ProjectSearchStatus {\r\n Open = \"O\",\r\n Closed = \"C\",\r\n All = \"A\",\r\n Delivered = \"D\",\r\n PartiallyDelivered = \"P\",\r\n SamplesDue = \"S\",\r\n Pending = \"W\",\r\n Cancelled = \"X\"\r\n}\r\n\r\nexport enum DataPackageType {\r\n Theory = \"T\",\r\n Experimental = \"E\"\r\n}\r\n\r\nexport enum Visibility {\r\n Internal = \"I\",\r\n User = \"U\",\r\n Public = \"P\",\r\n}\r\n\r\nexport enum ActivityCategory {\r\n Project = \"PROJ\",\r\n Theory = \"THEO\",\r\n Storage = \"STOR\",\r\n Transfer = \"TRANS\",\r\n Processing = \"PROC\",\r\n Characterization = \"CHAR\",\r\n}\r\n\r\nexport enum ActivityType {\r\n Preparation = \"PREP\",\r\n Synthesis = \"SYN\",\r\n PostTreatment = \"POST\",\r\n Dicing = \"DIC\",\r\n Grouping = \"GRP\",\r\n Publication = \"PUB\",\r\n Presentation = \"PRES\",\r\n Proposal = \"PROP\",\r\n Award = \"APPROV\",\r\n Document = \"DOC\",\r\n Decision = \"DEC\",\r\n Report = \"REP\",\r\n}\r\n\r\nexport enum ProjectType {\r\n Research = \"R\",\r\n Sample = \"S\",\r\n DataOnly = \"D\",\r\n Rsvp = \"V\",\r\n Inhouse = \"I\",\r\n}\r\n\r\nexport enum PublicationType {\r\n Inhouse = \"I\",\r\n External = \"E\",\r\n Local = \"L\"\r\n}\r\n\r\nexport enum CharacterizationMetaDataSource {\r\n Filename = \"Filename\",\r\n Manual = \"Manual\",\r\n XML = \"XML\",\r\n CSV = \"CSV\"\r\n}\r\n\r\nexport enum Lookup {\r\n RawMaterialCompounding = \"substrate_CMP\",\r\n RawMaterialTransport = \"substrate_CVT\",\r\n RawMaterialFloatingZone = \"substrate_FZ\"\r\n}\r\n\r\n\r\nexport enum Technique {\r\n Simulation = \"SIM\",\r\n Bulk = \"Bulk\",\r\n Substrate = \"Substrate\"\r\n}\r\n\r\nexport enum ProjectStatus {\r\n Approved = \"A\",\r\n Closed = \"C\",\r\n Pending = \"P\",\r\n Canceled = \"X\",\r\n}\r\n\r\nexport enum ReferencedMaterials {\r\n Project = \"Project\",\r\n Publication = \"Publication\",\r\n Sample = \"Sample\",\r\n All = \"All\"\r\n}\r\n\r\n/* eslint-disable @typescript-eslint/naming-convention */\r\nexport const ProcessDevelopment = \"P\";\r\n\r\nexport const RolesWithLabel: ISelectListEntry[] = [\r\n { key: \"11\", value: \"Faculty\" },\r\n { key: \"12\", value: \"Instrument Manger\" },\r\n { key: \"13\", value: \"Researcher\" },\r\n { key: \"14\", value: \"AdminAssistant\" }\r\n];\r\n/* eslint-enable @typescript-eslint/naming-convention */\r\n\r\nexport enum SampleImportStatus {\r\n Error = \"E\",\r\n Incomplete = \"I\",\r\n Created = \"C\",\r\n Updated = \"U\",\r\n Unchanged = \"X\",\r\n Pending = \"P\",\r\n ManualChange = \"M\"\r\n}\r\n\r\nexport enum CharacterizationUploadStatus {\r\n Pending = \"P\",\r\n Error = \"E\",\r\n SampleNotFound = \"S\",\r\n OK = \"OK\",\r\n NothingToDo = \"-\"\r\n}\r\n\r\nexport enum FileImportStatus {\r\n Pending = \"P\",\r\n UnknownFile = \"U\",\r\n Warn = \"W\",\r\n Error = \"E\"\r\n}\r\n\r\n\r\nexport enum AutoSubmitStatus {\r\n Pending = \"P\",\r\n Error = \"E\",\r\n Invalid = \"S\",\r\n OK = \"OK\",\r\n}\r\n\r\n\r\nexport enum ShippingFilter {\r\n Any = \"\",\r\n StartedOrCompleted = \"startedOrCompleted\",\r\n Completed = \"completed\",\r\n NotCompleted = \"notCompleted\",\r\n NotShipped = \"no\"\r\n}\r\n\r\nexport enum SampleReportingCategory {\r\n Research = \"R\",\r\n Maintenance = \"M\",\r\n ProcessDevelopment = \"P\"\r\n}\r\n","import ILabeled from \"./ILabeled\";\r\n\r\nexport default interface ISubstrate {\r\n id: number;\r\n name: string;\r\n materials: ISubstrateMaterial[];\r\n vendor: string;\r\n lot: string;\r\n purity?: number;\r\n granularity?: string;\r\n orientation: string;\r\n techniques: string[];\r\n usage?: number;\r\n\r\n label?: string;\r\n}\r\n\r\nexport interface ISubstrateMaterial {\r\n layer: number;\r\n id?: number;\r\n name?: string;\r\n label?: string;\r\n}\r\n\r\n\r\nexport class Substrate implements ISubstrate, ILabeled {\r\n public id: number;\r\n public name: string;\r\n public materials: ISubstrateMaterial[];\r\n // for lookups in recipes, those expect to find only one material.\r\n public get material() {\r\n return this.materials?.[0];\r\n }\r\n public vendor: string;\r\n public lot: string;\r\n public purity?: number;\r\n public granularity?: string;\r\n public orientation: string;\r\n public techniques: string[];\r\n public usage?: number;\r\n private _calculatedLabel: string;\r\n public get label() { return this._calculatedLabel; }\r\n\r\n constructor(model: ISubstrate) {\r\n this._calculatedLabel = this._createLabel(model);\r\n this.id = model.id;\r\n this.name = model.name;\r\n this.materials = model.materials;\r\n this.vendor = model.vendor;\r\n this.lot = model.lot;\r\n this.purity = model.purity;\r\n this.granularity = model.granularity;\r\n this.orientation = model.orientation;\r\n this.techniques = model.techniques;\r\n this.usage = model.usage;\r\n }\r\n\r\n private _createLabel(model: ISubstrate): string {\r\n let label = model.name;\r\n if (model.purity) {\r\n label += ` ${model.purity}% `;\r\n }\r\n if (model.vendor || model.lot) {\r\n label += \" (\";\r\n }\r\n if (model.vendor) {\r\n label += model.vendor;\r\n }\r\n if (model.vendor && model.lot) {\r\n label += \": \";\r\n }\r\n if (model.lot) {\r\n label += model.lot;\r\n }\r\n if (model.vendor || model.lot) {\r\n label += \")\";\r\n }\r\n return label;\r\n }\r\n}\r\n","import log from \"loglevel\";\r\n\r\nimport RemoteError, { StatusCode } from \"app/services/remote/RemoteError\";\r\n\r\nexport default class ApplicationError extends Error {\r\n public status: StatusCode;\r\n public action: string;\r\n public details: string;\r\n public htmlInPopup: string;\r\n\r\n public constructor(error: RemoteError | Error | string, action?: string, message?: string) {\r\n super();\r\n this.action = action ? action : \"An error occurred\";\r\n if (error instanceof RemoteError) {\r\n this.status = error.code;\r\n switch (error.code) {\r\n case 0:\r\n this.message = \"Could not connect to server.\";\r\n this.details = \"Please check your connection.\";\r\n break;\r\n\r\n case StatusCode.UnprocessableEntity as number:\r\n // this.message = \"The Server rejected the data as invalid.\";\r\n this.details = error.html;\r\n break;\r\n case StatusCode.FailedDependency as number:\r\n this.message = message ?? \"Operation could not be executed.\";\r\n this.details = error.html;\r\n break;\r\n case StatusCode.PreconditionRequired as number:\r\n this.message = message ?? \"Question.\";\r\n this.details = error.html;\r\n break;\r\n case StatusCode.ServerError as number:\r\n this.message = \"The server encountered an error.\";\r\n this.details = `

Please contact the\r\n 2DCC Data Manager\r\n

`;\r\n // Server Error sends a full web page in debug mode\r\n // This cannot be shown in a div, it would mess up everything since\r\n // it comes with it's on styles and scripts.\r\n // So we show the error page in a new window (if any html has been send).\r\n if (error.html) {\r\n const w = window.open(\r\n \"\",\r\n \"Internal Server Error\",\r\n \"toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes\"\r\n );\r\n w.document.body.innerHTML = error.html;\r\n }\r\n break;\r\n default:\r\n this.message = message ?? error.message;\r\n this.details = error.html;\r\n }\r\n } else if (error instanceof Error) {\r\n this.message = error.name;\r\n this.details = error.message;\r\n log.warn(error.stack);\r\n } else {\r\n this.message = message;\r\n this.details = error;\r\n log.trace(error);\r\n }\r\n }\r\n}\r\n","import ILabeled from \"../ILabeled\";\r\n\r\nexport default interface IMaterial {\r\n id?: number;\r\n name: string;\r\n form?: string;\r\n externalId?: string;\r\n label?: string;\r\n isSubstrate?: boolean;\r\n isConfidential?: boolean;\r\n aliases: IMaterial[];\r\n used?: boolean;\r\n}\r\n\r\nexport class Material implements IMaterial, ILabeled {\r\n public id?: number;\r\n public name: string;\r\n public isSubstrate: boolean;\r\n public isConfidential: boolean;\r\n public aliases: Material[];\r\n\r\n public form?: string;\r\n public externalId?: string;\r\n public label = \"\";\r\n public components: string[] = [];\r\n public used: boolean;\r\n\r\n public get link() {\r\n return this.externalId ? `https://materialsweb.org/twodmaterials/result/${this.externalId}` : undefined;\r\n }\r\n\r\n constructor(data: IMaterial) {\r\n this.id = data.id;\r\n this.name = data.name;\r\n this.isSubstrate = data.isSubstrate;\r\n this.isConfidential = data.isConfidential;\r\n this.aliases = data.aliases.map((a) => new Material(a));\r\n\r\n const parsed = Material.updateComponents(this.name);\r\n this.components = parsed.components;\r\n this.label = data.label || parsed.label + (data.form ? ` (${data.form})` : \"\");\r\n this.used = data.used;\r\n this.form = data.form;\r\n this.externalId = data.externalId;\r\n }\r\n\r\n public static initNew(n: string, substrate: boolean) {\r\n return new Material({\r\n aliases: [],\r\n id: undefined,\r\n isSubstrate: substrate,\r\n isConfidential: false,\r\n name: n\r\n });\r\n }\r\n\r\n public static createMap(array: Material[]): Map {\r\n const m = new Map();\r\n array.forEach((element) => {\r\n m.set(element.id, element);\r\n element.aliases.forEach((alias) => {\r\n m.set(alias.id, element);\r\n });\r\n });\r\n return m;\r\n }\r\n\r\n public static createMapByName(array: Material[]): Map {\r\n const m = new Map();\r\n array.forEach((element) => {\r\n m.set(element.name, element);\r\n element.aliases.forEach((alias) => {\r\n m.set(alias.name, element);\r\n });\r\n });\r\n return m;\r\n }\r\n\r\n // FIXME: To be done server side\r\n public static updateComponents(name: string) {\r\n const parts = name.split(/(?=[A-Z0-9x\\-(),])/);\r\n let label = \"\";\r\n const components: string[] = [];\r\n for (let i = 0; i < parts.length; i++) {\r\n if (/[(),]/.test(parts[i])) {\r\n // dont subscript parentheses\r\n label += parts[i];\r\n } else if (parts[i] === \"-\" && i > 0 && ! /[.0-9]/.test(parts[i - 1])) {\r\n // a dash as in index only when preceded by a number\r\n label += parts[i];\r\n } else if (parts[i].toLowerCase() === parts[i]) {\r\n // anything else that does not contain a capital letter is an index: numbers, x\r\n label += `${parts[i]}`;\r\n } else {\r\n components.push(parts[i]);\r\n label += parts[i];\r\n }\r\n }\r\n return { label, components };\r\n }\r\n}\r\n","import {\r\n ActivityCategory,\r\n ActivityType,\r\n ProjectSearchStatus,\r\n ProjectStatus,\r\n ProjectType,\r\n PublicationType,\r\n RequestStatus,\r\n SampleReportingCategory,\r\n Status,\r\n Visibility,\r\n} from \"../Constants\";\r\nimport Role from \"./Role\";\r\n\r\nexport interface ISelectListEntry {\r\n key: TEnum;\r\n value: string;\r\n masterKey?: string;\r\n}\r\n\r\nexport class SelectList {\r\n id: string;\r\n\r\n /* eslint-disable @typescript-eslint/naming-convention */\r\n public static ColumnType: SelectList = { id: \"ColumnType\" };\r\n public static MetadataSource: SelectList = { id: \"MetadataSource\" };\r\n public static MipMachine: SelectList = { id: \"MipMachine\" };\r\n public static ProjectCategory: SelectList = { id: \"ProjectCategory\" };\r\n public static ProjectType: SelectList = { id: \"ProjectType\" };\r\n public static Role: SelectList = { id: \"Role\" };\r\n public static SampleReportingCategory: SelectList = { id: \"SampleReportingCategory\" };\r\n public static Status: SelectList = { id: \"Status\" };\r\n public static ProjectStatus: SelectList = { id: \"ProjectStatus\" };\r\n\r\n public static ActivityCategory: SelectList = { id: \"ActivityCategory\" };\r\n public static ActivityType: SelectList = { id: \"ActivityType\" };\r\n public static Visibility: SelectList = { id: \"Visibility\" };\r\n public static ProjectSearchStatus: SelectList = { id: \"ProjectSearchStatus\" };\r\n public static SampleRequestStatus: SelectList = { id: \"SampleRequestStatus\" };\r\n public static ReportAttribute: SelectList = { id: \"ReportAttribute\" };\r\n public static ReportObject: SelectList = { id: \"ReportObject\" };\r\n public static ReportAggregation: SelectList = { id: \"ReportAggregation\" };\r\n public static PublicationType: SelectList = { id: \"PublicationType\" };\r\n /* eslint-enable @typescript-eslint/naming-convention */\r\n}\r\n\r\nexport interface ISelectListResult {\r\n columnType: ISelectListEntry[];\r\n metadataSource: ISelectListEntry[];\r\n mipMachine: ISelectListEntry[];\r\n projectCategory: ISelectListEntry[];\r\n projectType: ISelectListEntry[];\r\n role: ISelectListEntry[];\r\n status: ISelectListEntry[];\r\n projectStatus: ISelectListEntry[];\r\n activityCategory: ISelectListEntry[];\r\n activityType: ISelectListEntry[];\r\n projectSearchStatus: ISelectListEntry[];\r\n publicationType: ISelectListEntry[];\r\n sampleRequestStatus: ISelectListEntry[];\r\n sampleReportingCategory: ISelectListEntry[];\r\n reportAttribute: ISelectListEntry[];\r\n reportObject: ISelectListEntry[];\r\n reportAggregation: ISelectListEntry[];\r\n}\r\n\r\n/**\r\n * This holds the actual select lists internally, and assures the type of entries in a list is conform to the list.\r\n * That is, if we have a select list which is based on a JS enum, we store and return a list with entry enum -> label,\r\n * if it is a string based list (where the frontend does not know the actual enum entries, perhaps because it's extendable in the data base),\r\n * the list entries will be string -> label\r\n */\r\nexport class SelectListMap {\r\n private readonly _entries: Map[]> = new Map[]>();\r\n\r\n public get(key: SelectList): ISelectListEntry[] {\r\n if (key.id && typeof key.id === \"string\") {\r\n return this._entries.get(key.id) as ISelectListEntry[];\r\n } else {\r\n throw new Error(\"Invalid key type. Expected SelectList, but got \" + (key as any));\r\n }\r\n }\r\n\r\n public set(key: SelectList, list: ISelectListEntry[]) {\r\n return this._entries.set(key.id, list);\r\n }\r\n}\r\n","import IRemoteServer, { ExpectedReturnType } from \"app/services/remote/IRemoteServer\";\r\n\r\n\r\ntype ParamType = string | number | boolean | number[];\r\n\r\n/**\r\n * Base class for a repository using one controller,\r\n * with helper actions translating an object of params\r\n * {param1: value, parma2: value}\r\n * into url params.\r\n */\r\nexport default abstract class BaseControllerRepository {\r\n private readonly _apiVersion: string;\r\n private readonly _controller: string;\r\n private readonly _remote: IRemoteServer;\r\n\r\n /**\r\n * All request use the controller initialized here\r\n *\r\n * @param {string} controller\r\n * @param {IRemoteServer} remote\r\n */\r\n constructor(apiVersion: string, controller: string, remote: IRemoteServer) {\r\n this._apiVersion = apiVersion;\r\n this._controller = controller;\r\n this._remote = remote;\r\n }\r\n\r\n /**\r\n * Calls the backend controller, using the given action (or the default action of the controller if undefined).\r\n * Uses HTTP GET\r\n *\r\n *\r\n * @param {{[key:string]:string|number|boolean}} params?\r\n * @param {string} action controller action\r\n * @returns Promise\r\n */\r\n protected async remoteGet(action?: string, params?: { [key: string]: ParamType }): Promise {\r\n return this._remote.get(this._getUrl(params, action));\r\n }\r\n\r\n /**\r\n * Calls the backend, using the given action (or the default action of controller if undefined).\r\n * Uses HTTP GET\r\n * The params are inserted as params into the url.\r\n *\r\n * * Allows the specification of an alternative return type.\r\n *\r\n * @param {{[key:string]:string|number|boolean}} params\r\n * @param {string} action controller action\r\n * @returns Promise\r\n */\r\n protected async remoteGetAny(action?: string, params?: { [key: string]: ParamType }): Promise {\r\n return this._remote.get(this._getUrl(params, action));\r\n }\r\n\r\n /**\r\n * Calls the backend, using the given action (or the default action of controller if undefined).\r\n * Uses HTTP GET\r\n * The params are inserted as params into the url.\r\n *\r\n * * Expects the server to return a string, not a valid JSON.\r\n *\r\n * @param {{[key:string]:string|number|boolean}} params\r\n * @param {string} action controller action\r\n * @returns Promise\r\n */\r\n protected async remoteGetString(action?: string, params?: { [key: string]: ParamType }): Promise {\r\n return this._remote.get(this._getUrl(params, action), ExpectedReturnType.TEXT);\r\n }\r\n\r\n /**\r\n * Calls the backend, using the given action (or the default action of controller if undefined).\r\n * Uses HTTP GET\r\n * The params are inserted as get params into the url.\r\n *\r\n * @param {{[key:string]:string|number|boolean}} params?\r\n * @param {string} action controller action\r\n * @returns Promise containing an array. An error is raised if the server does not return an array.\r\n */\r\n protected async remoteGetArray(\r\n action?: string,\r\n params?: { [key: string]: ParamType }\r\n ): Promise {\r\n return this._remote.getArray(this._getUrl(params, action));\r\n }\r\n\r\n /**\r\n * Send the base type of the controller via POST request, using the given action\r\n * The data is sent in the request body, params are included as url params\r\n *\r\n * @param data\r\n * @param {string} action controller action\r\n * @returns Promise\r\n */\r\n protected async remotePost(\r\n data: T,\r\n action?: string,\r\n params?: { [key: string]: ParamType }\r\n ): Promise {\r\n return this._remote.post(this._getUrl(params, action), data);\r\n }\r\n\r\n /**\r\n * Sends a POST request to the backend, using the given action.\r\n * The data is sent in the request body, params are included as url params\r\n *\r\n * @param data\r\n * @param {string} action controller action\r\n * @returns Promise\r\n */\r\n protected async remotePostAny(\r\n data: any, action: string, params?: { [key: string]: ParamType }\r\n ): Promise {\r\n return this._remote.post(this._getUrl(params, action), data);\r\n }\r\n\r\n /**\r\n * Sends a DELETE request to the backend, using the given action.\r\n * Params are included as url params.\r\n *\r\n * @param {{[key:string]:string|number|boolean}} params i.e. ID of the object to delete\r\n * @param {string} action controller action\r\n * @returns An old version of the data, if a pending version was deleted.\r\n * NoContent, if the only version was deleted.\r\n */\r\n protected async remoteDeleteVersion(\r\n action: string,\r\n params: { [key: string]: ParamType } = {}\r\n ): Promise {\r\n return this._remote.delete(this._getUrl(params, action));\r\n }\r\n\r\n /**\r\n * Sends a DELETE request to the backend, using the given action.\r\n * Params are included as url params.\r\n *\r\n * @param {{[key:string]:string|number|boolean}} params i.e. ID of the object to delete\r\n * @param {string} action controller action\r\n * @returns\r\n */\r\n protected async remoteDelete(\r\n action: string,\r\n params: { [key: string]: ParamType } = {}\r\n ): Promise {\r\n return this._remote.delete(this._getUrl(params, action));\r\n }\r\n\r\n /**\r\n * Sends a PUT request to the backed, using given action.\r\n * Params are send in the url, optional data is send via request body.\r\n *\r\n * @param {{[key:string]:string|number|boolean}} params?\r\n * @param {string} action controller action\r\n * @returns Promise\r\n */\r\n protected async remotePutAny(\r\n data: any,\r\n action: string,\r\n params?: { [key: string]: ParamType },\r\n ): Promise {\r\n return this._remote.put(this._getUrl(params, action), data);\r\n }\r\n\r\n /**\r\n * Send the base type of the controller via PUT request, using the given action\r\n * The data is sent in the request body, params are included as url params\r\n *\r\n * @param data\r\n * @param {string} action controller action\r\n * @returns Promise\r\n */\r\n protected async remotePut(\r\n data: T,\r\n action?: string,\r\n params?: { [key: string]: ParamType }\r\n ): Promise {\r\n return this._remote.put(this._getUrl(params, action), data);\r\n }\r\n\r\n /**\r\n * Sends a Patch request to the backed, using given action.\r\n * Params are send in the url, optional data is send via request body.\r\n *\r\n * @param {string} action controller action\r\n * @returns Promise\r\n */\r\n protected async remotePatch(\r\n action: string,\r\n params?: { [key: string]: ParamType }\r\n ): Promise {\r\n return this._remote.patch(this._getUrl(params, action));\r\n }\r\n\r\n /**\r\n * Sends a Patch request to the backed, using given action.\r\n * Params are send in the url, optional data is send via request body.\r\n *\r\n * @param {string} action controller action\r\n * @returns Promise\r\n */\r\n protected async remotePatchAny(\r\n action: string,\r\n params?: { [key: string]: ParamType },\r\n data?: any\r\n ): Promise {\r\n return this._remote.patch(this._getUrl(params, action), data);\r\n }\r\n\r\n protected async remoteDownloadFile(\r\n action: string, filename: string, params?: { [key: string]: ParamType }, data?: any\r\n ): Promise {\r\n return data ? this._remote.downloadViaPost(this._getUrl(params, action), filename, data) :\r\n this._remote.downloadViaGet(this._getUrl(params, action), filename);\r\n }\r\n\r\n\r\n /**\r\n * Create a URL for backend call using controller, action and parameters.\r\n * Depending on the server configuration, a base path might be added, too.\r\n *\r\n * @param {{[key:string]:string|number|boolean}} params?\r\n * @param {string} action controller action\r\n * @returns string\r\n */\r\n protected createRelativeUrl(params: { [key: string]: ParamType }, action: string): string {\r\n return this._remote.createRelativeUrl(this._getUrl(params, action));\r\n }\r\n\r\n private _getUrl(params: { [key: string]: ParamType }, action?: string): string {\r\n let url = `/api/${this._apiVersion}/${this._controller}`;\r\n if (action) {\r\n url += \"/\" + action;\r\n }\r\n if (params && Object.keys(params).length > 0) {\r\n url += \"?\";\r\n Object.keys(params).forEach((key) => {\r\n const value = params[key];\r\n // only exclude undefined and null.\r\n // A boolean with value \"false\" should be included in the URL,\r\n // so that \"true\", \"false\", \"undefined\" == anything can be distinguished\r\n if (value !== undefined && value !== null) {\r\n url += `${key}=${value.toString()}&`;\r\n }\r\n });\r\n }\r\n return url;\r\n }\r\n}\r\n","\r\nimport ICharacterizationInstrument from \"app/model/masterdata/CharacterizationInstrument\";\r\n\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\nimport BaseControllerRepository from \"./BaseControllerRepository\";\r\nimport ICustomizingRepository from \"./ICustomizingRepository\";\r\n\r\nexport default interface ICharacterizationInstrumentRepository\r\n extends ICustomizingRepository {\r\n\r\n /**\r\n * Load a list of characterization instruments.\r\n *\r\n * @param loadDefaultConfig Include the list of meta data configuration, requires\r\n * access right to upload characterization data.\r\n * @param facility\r\n */\r\n loadAll(loadDefaultConfig?: boolean): Promise;\r\n\r\n create(entity: ICharacterizationInstrument): Promise;\r\n update(entity: ICharacterizationInstrument): Promise;\r\n\r\n getDropdownChoices(): Promise;\r\n}\r\n\r\n\r\nexport interface ICharInstrumentDropdownChoices {\r\n locations: string[];\r\n facilities: string[];\r\n columnTypes: string[];\r\n}\r\n\r\n\r\nexport class CharacterizationInstrumentRepository\r\n extends BaseControllerRepository\r\n implements ICharacterizationInstrumentRepository {\r\n\r\n constructor(remote: IRemoteServer) {\r\n super(\"v1\", \"characterization-instruments\", remote);\r\n }\r\n\r\n public async loadAll(\r\n loadDefaultConfig = false\r\n ): Promise {\r\n return this.remoteGetArray(\"\", { loadDefaultConfig });\r\n }\r\n\r\n public async create(entity: ICharacterizationInstrument): Promise {\r\n return this.remotePost(entity);\r\n }\r\n\r\n public async update(entity: ICharacterizationInstrument): Promise {\r\n return this.remotePut(entity, `${entity.id}`);\r\n }\r\n\r\n public async delete(id: string): Promise {\r\n return this.remoteDelete(`${id}`);\r\n }\r\n\r\n public async getDropdownChoices(): Promise {\r\n return this.remoteGetAny(\"drop-down-choices\");\r\n }\r\n\r\n}\r\n","import ICharacterizationTechnique from \"app/model/masterdata/CharacterizationTechnique\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\nimport BaseControllerRepository from \"./BaseControllerRepository\";\r\nimport ICustomizingRepository from \"./ICustomizingRepository\";\r\n\r\nexport default interface ICharacterizationTechniqueRepository\r\n extends ICustomizingRepository {\r\n loadAll(): Promise;\r\n}\r\n\r\nexport class CharacterizationTechniqueRepository\r\n extends BaseControllerRepository\r\n implements ICharacterizationTechniqueRepository {\r\n\r\n constructor(remote: IRemoteServer) {\r\n super(\"v1\", \"characterization-techniques\", remote);\r\n }\r\n\r\n public async loadAll(): Promise {\r\n return this.remoteGetArray();\r\n }\r\n\r\n public async update(technique: ICharacterizationTechnique): Promise {\r\n return this.remotePut(technique, `${technique.id}`);\r\n }\r\n public async create(technique: ICharacterizationTechnique): Promise {\r\n return this.remotePost(technique);\r\n }\r\n\r\n public async delete(id: string): Promise {\r\n return this.remoteDelete(`${id}`);\r\n }\r\n}\r\n","import log from \"loglevel\";\r\n\r\nimport ICollaborator from \"app/model/masterdata/Collaborator\";\r\nimport IProjectSearchCriteria from \"app/model/settings/IProjectSearchCriteria\";\r\nimport ISampleSearchCriteria from \"app/model/settings/ISampleSearchCriteria\";\r\nimport IUserSettings from \"app/model/settings/UserSettings\";\r\nimport BaseControllerRepository from \"app/repository/BaseControllerRepository\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\nimport ISampleFilter from \"app/viewModel/sample/SampleFilter\";\r\nimport ICustomizingRepository from \"./ICustomizingRepository\";\r\nimport IRole from \"app/model/masterdata/Role\";\r\nimport IDataPackageSearchCriteria from \"app/model/settings/IDataPackageSearchCriteria\";\r\n\r\nexport default interface ICollaboratorRepository extends ICustomizingRepository {\r\n\r\n getCurrent(): Promise;\r\n getRoles(): Promise;\r\n selectRole(roleId: number): Promise;\r\n signInAs(userId: string, roleId: number): Promise\r\n stopSignInAs(): Promise\r\n\r\n // Get community users (outside 2DCC)\r\n getUsers(customizing?: boolean): Promise;\r\n // Get all internal 2DCC users\r\n getStaff(customizing?: boolean): Promise;\r\n\r\n get(id: string): Promise;\r\n create(entity: ICollaborator): Promise;\r\n update(entity: ICollaborator): Promise;\r\n delete(id: string): Promise;\r\n\r\n saveProjectCriteria(criteria: IProjectSearchCriteria): Promise;\r\n saveDataPackageCriteria(criteria: IDataPackageSearchCriteria): Promise;\r\n saveSampleCriteria(criteria: ISampleSearchCriteria): Promise;\r\n saveSampleFilter(filter: ISampleFilter): Promise;\r\n deleteSampleFilter(): Promise;\r\n saveUserSettings(settings: IUserSettings): Promise;\r\n saveLastProject(id: number): void;\r\n saveLastSample(id: number): void;\r\n\r\n}\r\n\r\nexport class CollaboratorRepository extends BaseControllerRepository implements ICollaboratorRepository {\r\n constructor(remote: IRemoteServer) {\r\n super(\"v1\", \"users\", remote);\r\n }\r\n public async getCurrent(): Promise {\r\n return this.remoteGet(\"current\");\r\n }\r\n\r\n public async getRoles(): Promise {\r\n return this.remoteGetAny(`roles`);\r\n }\r\n\r\n\r\n public async selectRole(roleId: number): Promise {\r\n return this.remotePostAny(roleId, \"roles\");\r\n }\r\n\r\n public async signInAs(userId: string, roleId: number): Promise {\r\n return this.remotePostAny({ userId, roleId }, \"signInAs\");\r\n }\r\n\r\n public async stopSignInAs(): Promise {\r\n return this.remotePostAny({}, \"stopSignInAs\");\r\n }\r\n\r\n public async getUsers(customizing = false): Promise {\r\n return this.remoteGetArray(\"community\", { customizing });\r\n }\r\n public async getStaff(customizing = false): Promise {\r\n return this.remoteGetArray(\"inhouse\", { customizing });\r\n }\r\n\r\n public async get(id: string): Promise {\r\n return this.remoteGet(`${id}`);\r\n }\r\n\r\n public async create(entity: ICollaborator): Promise {\r\n return this.remotePost(entity);\r\n }\r\n\r\n public async update(entity: ICollaborator): Promise {\r\n return this.remotePut(entity, `${entity.id}`);\r\n }\r\n\r\n public async delete(id: string): Promise {\r\n return this.remoteDelete(`${id}`);\r\n }\r\n\r\n public async saveProjectCriteria(criteria: IProjectSearchCriteria): Promise {\r\n await this.remotePutAny(criteria, \"project-search\");\r\n }\r\n\r\n public async saveSampleCriteria(criteria: ISampleSearchCriteria): Promise {\r\n await this.remotePutAny(criteria, \"sample-search\");\r\n }\r\n\r\n public async saveDataPackageCriteria(criteria: IDataPackageSearchCriteria): Promise {\r\n await this.remotePutAny(criteria, \"data-package-search\");\r\n }\r\n\r\n public async saveSampleFilter(filter: ISampleFilter): Promise {\r\n await this.remotePutAny(filter, \"sample-filter\");\r\n }\r\n\r\n public async deleteSampleFilter(): Promise {\r\n await this.remoteDelete(\"sample-filter\");\r\n }\r\n\r\n public async saveUserSettings(settings: IUserSettings): Promise {\r\n return this.remotePutAny(settings, \"save-settings\");\r\n }\r\n\r\n public saveLastProject(id: number): void {\r\n this.remotePutAny(id, \"last-project\")\r\n .catch((error) => log.error(error));\r\n }\r\n\r\n public saveLastSample(id: number): void {\r\n this.remotePutAny(id, \"last-sample\")\r\n .catch((error) => log.error(error));\r\n\r\n }\r\n\r\n}\r\n","import { ReferencedMaterials } from \"app/model/Constants\";\r\nimport IMaterial, { Material } from \"app/model/masterdata/Material\";\r\nimport BaseControllerRepository from \"app/repository/BaseControllerRepository\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\nimport ICustomizingRepository from \"./ICustomizingRepository\";\r\n\r\nexport default interface IMaterialRepository extends ICustomizingRepository {\r\n loadAll(referencedBy?: ReferencedMaterials, includeUsage?: boolean): Promise;\r\n\r\n create(material: IMaterial): Promise;\r\n\r\n update(material: IMaterial): Promise;\r\n\r\n delete(id: number): Promise;\r\n}\r\n\r\nexport class MaterialRepository extends BaseControllerRepository implements IMaterialRepository {\r\n\r\n constructor(remote: IRemoteServer) {\r\n super(\"v1\", \"materials\", remote);\r\n }\r\n\r\n public async loadAll(\r\n referencedBy: ReferencedMaterials = ReferencedMaterials.All,\r\n includeUsage = false\r\n ): Promise {\r\n const loaded = await this.remoteGetArray(\"\", { includeUsage, referencedBy });\r\n // Map the data, extracting components.\r\n return loaded.map((data) => new Material(data));\r\n }\r\n\r\n public async create(material: IMaterial): Promise {\r\n const m = await this.remotePost(material);\r\n return new Material(m);\r\n }\r\n\r\n\r\n public async update(material: IMaterial): Promise {\r\n const m = await this.remotePut(material, `${material.id}`);\r\n return new Material(m);\r\n }\r\n\r\n public async delete(id: number): Promise {\r\n return this.remoteDelete(`${id}`);\r\n }\r\n}\r\n","import ICheckResult from \"app/model/ICheckResult\";\r\nimport INote from \"app/model/Note\";\r\nimport IProject from \"app/model/Project\";\r\nimport ISample from \"app/model/Sample\";\r\nimport ISampleRequest from \"app/model/SampleRequest\";\r\nimport IProjectSearchCriteria from \"app/model/settings/IProjectSearchCriteria\";\r\nimport IShipping from \"app/model/Shipping\";\r\nimport BaseControllerRepository from \"app/repository/BaseControllerRepository\";\r\nimport ISaveableRepository from \"app/repository/ISaveableRepository\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\nimport ICommunication from \"../model/Communication\";\r\nimport IProjectActivity from \"../model/ProjectActivity\";\r\nimport ITheoryActivity from \"../model/TheoryActivity\";\r\nimport INoteRepository from \"./INotesRepository\";\r\nimport ISampleRequestRepository from \"./ISampleRequestRepository\";\r\nimport { IContactDetails } from \"./ShippingRepository\";\r\nimport IUserPrivilege from \"app/model/masterdata/UserPrivilege\";\r\nimport { Privilege, Operation } from \"app/auth/AuthConstants\";\r\nimport { IDataPackage } from \"app/model/DataPackage\";\r\nimport { IShareLinkResult } from \"./IFileOwnerRepository\";\r\n\r\n\r\nexport default interface IProjectRepository extends\r\n ISaveableRepository,\r\n INoteRepository,\r\n ISampleRequestRepository {\r\n \r\n /**\r\n * Lookup projects\r\n *\r\n * @param {IProjectSearchCriteria} criteria\r\n */\r\n search(\r\n criteria: IProjectSearchCriteria,\r\n sortColumn: string, sortOrder: string,\r\n start: number, length: number, draw: number): Promise;\r\n\r\n loadProjectsWithCollaborators(): Promise;\r\n\r\n /**\r\n * Get the access rights of the currently logged in user for this project.\r\n *\r\n * @param idOrLabel (numerical) ID or label of a project\r\n * @returns An list of privileges, @see IUserPrivilege\r\n */\r\n getAccessRights(idOrLabel: number | string): Promise;\r\n\r\n /**\r\n * Load a project\r\n *\r\n * @param idOrLabel (numerical) ID or label of a project\r\n * @returns the project\r\n */\r\n get(idOrLabel: number | string): Promise;\r\n\r\n /** \r\n * Check if there are projects with the given privileges.\r\n * UI can use this to hide/show buttons or menu entries.\r\n */\r\n existsProjectWith(privilege: Privilege[], op: Operation): Promise;\r\n\r\n /**\r\n * Check if a project id is already used. Invoked just before saving,\r\n * to minimize the risk of a unique key constraint error.\r\n *\r\n * @param id\r\n */\r\n isValidProjectLabel(label: string): Promise;\r\n\r\n /**\r\n * Get a unique ID from the server. It is not used at the time of requesting,\r\n * should two users request new IDs at the same time, saving might still fail.\r\n * (@see isIdUsed)\r\n *\r\n * @param prefix Prefix\r\n * @param alwaysAddNumber If true, a number is always added to make it unique (for sample/research projects).\r\n * If false, a number is only added if the prefix itself is alway taken.\r\n */\r\n getFreeLabel(prefix: string, alwaysAddNumber?: boolean): Promise;\r\n\r\n getCommunications(projectId: number): Promise;\r\n\r\n getRecentSamples(projectId: number, days: number, includeShipped: boolean): Promise;\r\n\r\n getOldSamples(projectId: number, days: number, includeShipped: boolean): Promise;\r\n\r\n getShippings(projectId: number): Promise;\r\n\r\n getProjectActivities(projectId: number): Promise;\r\n\r\n getTheoryActivities(projectId: number): Promise;\r\n\r\n getDataPackages(projectId: number): Promise;\r\n\r\n getContactDetails(projectId: number, contactName: string): Promise;\r\n\r\n getBudgets(projectId: number): Promise;\r\n\r\n getContacts(projectId: number): Promise;\r\n\r\n getSharingLink(id: number, forceCopy?: boolean): Promise;\r\n}\r\n\r\n\r\nexport class ProjectRepository extends BaseControllerRepository implements IProjectRepository {\r\n constructor(remote: IRemoteServer) {\r\n super(\"v1\", \"projects\", remote);\r\n }\r\n\r\n public async get(id: number | string): Promise {\r\n return this.remoteGet(`${id}`);\r\n }\r\n\r\n\r\n public async getByLabel(label: string): Promise {\r\n return this.remoteGet(`${label}`);\r\n }\r\n\r\n public async search(\r\n criteria: IProjectSearchCriteria,\r\n sortColumn: string, sortOrder: string,\r\n start: number, length: number, draw: number): Promise {\r\n return this.remotePostAny(criteria, \"search\", {\r\n draw,\r\n length,\r\n sortColumn,\r\n sortOrder,\r\n start,\r\n });\r\n }\r\n\r\n public async loadProjectsWithCollaborators(): Promise {\r\n return this.remoteGetArray();\r\n }\r\n\r\n public async update(project: IProject): Promise {\r\n return this.remotePut(project, `${project.id}`);\r\n }\r\n\r\n public async create(project: IProject): Promise {\r\n return this.remotePost(project);\r\n }\r\n\r\n public async submit(id: number): Promise {\r\n return this.remotePatch(`${id}/submit`);\r\n }\r\n\r\n public async deletePending(id: number): Promise {\r\n return this.remoteDeleteVersion(`${id}`);\r\n }\r\n\r\n public async resetPending(id: number): Promise {\r\n return this.remotePatch(`${id}/reset`);\r\n }\r\n\r\n public async getAccessRights(projectId: number): Promise {\r\n return this.remoteGetAny(`access-rights/${projectId}`);\r\n }\r\n\r\n public async getAccessRightsByLabel(label: string): Promise {\r\n return this.remoteGetAny(\"access-rights\", { label });\r\n }\r\n\r\n public async existsProjectWith(privileges: Privilege[], op: Operation): Promise {\r\n const p = privileges.join(\",\");\r\n return this.remoteGetAny(\"exists\", { privileges: p, op })\r\n }\r\n\r\n\r\n public async saveNotes(id: number, data: INote[]): Promise {\r\n return this.remotePostAny(data, `${id}/notes`);\r\n }\r\n\r\n public async getNotes(id: number): Promise {\r\n return this.remoteGetAny(`${id}/notes`);\r\n }\r\n\r\n public async deleteNote(projectId: number, noteId: number): Promise {\r\n return this.remoteDelete(`${projectId}/notes/${noteId}`);\r\n }\r\n\r\n public async getRecentSamples(projectId: number, days: number, includeShipped: boolean): Promise {\r\n return this.remoteGetAny(`${projectId}/samples`, { nbOfDays: days, recent: true, includeShipped });\r\n }\r\n\r\n public async getOldSamples(projectId: number, days: number, includeShipped: boolean): Promise {\r\n return this.remoteGetAny(`${projectId}/samples`, { nbOfDays: days, recent: false, includeShipped });\r\n }\r\n\r\n public async getShippings(projectId: number): Promise {\r\n return this.remoteGetAny(`${projectId}/shippings`);\r\n }\r\n\r\n public async getProjectActivities(projectId: number): Promise {\r\n return this.remoteGetAny(`${projectId}/project-activities`);\r\n }\r\n\r\n public async getTheoryActivities(projectId: number): Promise {\r\n return this.remoteGetAny(`${projectId}/theory-activities`);\r\n }\r\n\r\n public async getCommunications(projectId: number): Promise {\r\n return this.remoteGetAny(`${projectId}/communications`);\r\n }\r\n\r\n public async getDataPackages(projectId: number): Promise {\r\n return this.remoteGetAny(`${projectId}/data-packages`);\r\n }\r\n\r\n public async saveSampleRequests(projectId: number, data: ISampleRequest[]): Promise {\r\n return this.remotePostAny(data, `${projectId}/sample-requests`);\r\n }\r\n\r\n public async getSampleRequests(projectId: number): Promise {\r\n return this.remoteGetAny(`${projectId}/sample-requests`);\r\n }\r\n\r\n public async deleteSampleRequest(projectId: number, requestId: number): Promise {\r\n return this.remoteDelete(`${projectId}/sample-requests/${requestId}`);\r\n }\r\n\r\n public async isValidProjectLabel(label: string): Promise {\r\n return this.remoteGetAny(`is-valid-label/${label}`);\r\n }\r\n\r\n public async getFreeLabel(label: string, alwaysAddNumber = false): Promise {\r\n return this.remoteGetString(`get-free-label/${label}`, { alwaysAddNumber });\r\n }\r\n\r\n public async getBudgets(projectId: number): Promise {\r\n return this.remoteGetAny(`${projectId}/shipping-budgets`);\r\n }\r\n\r\n public async getContacts(projectId: number): Promise {\r\n return this.remoteGetAny(`${projectId}/shipping-contacts`);\r\n }\r\n\r\n public async getContactDetails(projectId: number, contactName: string): Promise {\r\n return this.remoteGetAny(`${projectId}/contact-details`, { contactName });\r\n }\r\n\r\n public async getSharingLink(id: number, forceCopy = false): Promise {\r\n return this.remoteGetAny(`${id}/getLink`);\r\n }\r\n}\r\n","\r\nimport { IPublication, ICreatePublicationRequest, IUpdatePublicationRequest } from \"app/model/Publication\";\r\nimport BaseControllerRepository from \"app/repository/BaseControllerRepository\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\nimport IScienceDriver from \"app/model/masterdata/ScienceDriver\";\r\nimport { IDataPackage } from \"app/model/DataPackage\";\r\nimport IPublicationSearchCriteria from \"app/model/settings/IPublicationSearchCriteria\";\r\nimport { IPaginatedList } from \"app/helper/PaginatedList\";\r\n\r\nexport default interface IPublicationRepository {\r\n get(id: number | string): Promise;\r\n create(publication: ICreatePublicationRequest): Promise;\r\n update(publication: IUpdatePublicationRequest): Promise;\r\n delete(id: number): Promise;\r\n\r\n loadAll(): Promise;\r\n\r\n search(\r\n criteria: IPublicationSearchCriteria,\r\n sortColumn: string,\r\n sortOrder: string,\r\n start: number,\r\n length: number,\r\n draw: number\r\n ): Promise>;\r\n\r\n getScienceDrivers(): Promise;\r\n getJournals(): Promise;\r\n getDataPackages(publicationId: number): Promise;\r\n\r\n getDimensionsCitation(url: string): Promise;\r\n}\r\n\r\nexport class PublicationRepository extends BaseControllerRepository implements IPublicationRepository {\r\n constructor(remote: IRemoteServer) {\r\n super(\"v1\", \"publications\", remote);\r\n }\r\n\r\n public async search(\r\n criteria: IPublicationSearchCriteria,\r\n sortColumn: string,\r\n sortOrder: string,\r\n start: number,\r\n length: number,\r\n draw: number\r\n ): Promise> {\r\n return this.remotePostAny>(criteria, \"search\", {\r\n draw,\r\n length,\r\n sortColumn,\r\n sortOrder,\r\n start,\r\n });\r\n }\r\n\r\n public async loadAll(): Promise {\r\n return this.remoteGetArray();\r\n }\r\n\r\n public async getScienceDrivers(): Promise {\r\n return this.remoteGetAny(\"science-drivers\");\r\n }\r\n\r\n public async getJournals(): Promise {\r\n return this.remoteGetAny(\"journals\");\r\n }\r\n\r\n public async getDataPackages(publicationId: number): Promise {\r\n return this.remoteGetAny(`${publicationId}/data-packages`);\r\n }\r\n\r\n public async get(id: number | string): Promise {\r\n return this.remoteGet(`${id}`);\r\n }\r\n\r\n public async create(request: ICreatePublicationRequest): Promise {\r\n return this.remotePostAny(request, '');\r\n }\r\n\r\n public async update(request: IUpdatePublicationRequest): Promise {\r\n return this.remotePutAny(request, `${request.id}`);\r\n }\r\n\r\n public async delete(id: number): Promise {\r\n return this.remoteDelete(`${id}`);\r\n }\r\n\r\n public async getDimensionsCitation(url: string): Promise {\r\n return this.remoteGetString(`dimensions/${url}`);\r\n }\r\n}\r\n","import { ISelectListResult, SelectList } from \"app/model/masterdata/SelectList\";\r\nimport BaseControllerRepository from \"app/repository/BaseControllerRepository\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\n\r\nexport default interface ISelectListRepository {\r\n get(lists?: SelectList[]): Promise;\r\n}\r\n\r\nexport class SelectListRepository extends BaseControllerRepository implements ISelectListRepository {\r\n constructor(remote: IRemoteServer) {\r\n super(\"v1\", \"dropdowns\", remote);\r\n }\r\n\r\n public async get(lists?: SelectList[]): Promise {\r\n if (lists) {\r\n return this.remoteGet(\"\", { lists: lists.map(l => l.id).join(\",\") });\r\n } else {\r\n return this.remoteGet();\r\n }\r\n }\r\n}\r\n","import { Technique } from \"app/model/Constants\";\r\nimport ISynthesisInstrument from \"app/model/masterdata/SynthesisInstrument\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\nimport BaseControllerRepository from \"./BaseControllerRepository\";\r\nimport ICustomizingRepository from \"./ICustomizingRepository\";\r\n\r\nexport default interface ISynthesisInstrumentRepository extends ICustomizingRepository {\r\n update(instrument: ISynthesisInstrument): Promise;\r\n create(instrument: ISynthesisInstrument): Promise;\r\n loadAll(technique?: Technique, exclude?: boolean): Promise;\r\n}\r\n\r\nexport class SynthesisInstrumentRepository\r\n extends BaseControllerRepository\r\n implements ISynthesisInstrumentRepository {\r\n\r\n constructor(remote: IRemoteServer) {\r\n super(\"v1\", \"synthesis-instruments\", remote);\r\n }\r\n\r\n public async loadAll(technique?: Technique, exclude = false): Promise {\r\n return this.remoteGetArray(\"\", { technique, exclude });\r\n }\r\n\r\n public async update(instrument: ISynthesisInstrument): Promise {\r\n return this.remotePut(instrument, `${instrument.id}`);\r\n }\r\n\r\n public async create(instrument: ISynthesisInstrument): Promise {\r\n return this.remotePost(instrument);\r\n }\r\n\r\n public async delete(id: string): Promise {\r\n return this.remoteDelete(`${id}`);\r\n }\r\n\r\n}\r\n","import ISynthesisTechnique from \"app/model/masterdata/SynthesisTechnique\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\nimport BaseControllerRepository from \"./BaseControllerRepository\";\r\nimport ICustomizingRepository from \"./ICustomizingRepository\";\r\n\r\nexport default interface ISynthesisTechniqueRepository extends ICustomizingRepository {\r\n loadAll(parentTechnique?: string): Promise;\r\n}\r\n\r\nexport class SynthesisTechniqueRepository\r\n extends BaseControllerRepository\r\n implements ISynthesisTechniqueRepository {\r\n\r\n constructor(remote: IRemoteServer) {\r\n super(\"v1\", \"synthesis-techniques\", remote);\r\n }\r\n\r\n public async loadAll(parentTechnique?: string): Promise {\r\n return this.remoteGetArray(\"\", { parentTechnique });\r\n }\r\n\r\n public async update(technique: ISynthesisTechnique): Promise {\r\n return this.remotePut(technique, `${technique.id}`);\r\n }\r\n public async create(technique: ISynthesisTechnique): Promise {\r\n return this.remotePost(technique);\r\n }\r\n\r\n public async delete(id: string): Promise {\r\n return this.remoteDelete(`${id}`);\r\n }\r\n}\r\n","export default interface IRemoteServer {\r\n /**\r\n * Expand a url with a static prefix the server might have configured.\r\n * A url param userId is added if present, except if withoutUserId is set to true.\r\n * The latter might be necessary for static files like images,\r\n * or for sharing a link to a sample/project.\r\n *\r\n * @param {string} url\r\n */\r\n createRelativeUrl(url: string): string;\r\n\r\n createRelativeDataUrl(url: string): string;\r\n\r\n /**\r\n * Get a url including server and protocol.\r\n * Return protocol + server + port + createRelativeUrl\r\n *\r\n * @param url\r\n */\r\n createAbsoluteUrl(url: string): string;\r\n\r\n createAbsoluteDataUrl(url: string): string;\r\n\r\n createPublicDataUrl(id: string): string;\r\n\r\n /**\r\n * The base url to LiST, used as a forward when loading an initial object does not work. (non existing sample etc.)\r\n */\r\n getBaseAppUrl(): string;\r\n\r\n /**\r\n * Turn the current window.location url into an Url that forces sign in, then redirects to the original URL.\r\n *\r\n * Used when a direct link to a LiST returns in a NotFound or Forbidden, which might just be due to user not signed in.\r\n */\r\n getForwardUrlWithLogin(): string;\r\n\r\n getQueryVariable(variable: string): string | undefined;\r\n\r\n getAntiForgeryHeader(): any;\r\n\r\n patch(url: string, data?: T): Promise;\r\n\r\n post(url: string, data: T): Promise;\r\n\r\n put(url: string, data?: T): Promise;\r\n\r\n delete(url: string): Promise;\r\n\r\n get(url: string, expectedContent?: ExpectedReturnType): Promise;\r\n\r\n getArray(url: string): Promise;\r\n\r\n downloadViaPost(url: string, filename: string, data?: any): Promise;\r\n\r\n downloadViaGet(url: string, filename: string): Promise;\r\n}\r\n\r\nexport enum ExpectedReturnType {\r\n JSON = \"json\",\r\n HTML = \"html\",\r\n TEXT = \"text\",\r\n}\r\n","export default class RemoteError extends Error {\r\n public html: string;\r\n public code: number;\r\n\r\n constructor(code: number, statusText: string, html: string) {\r\n super();\r\n this.message = `Error ${code} (${statusText})`;\r\n this.html = html;\r\n this.code = code;\r\n }\r\n}\r\n\r\n/**\r\n * HTTP error codes that the server might send.\r\n */\r\nexport enum StatusCode {\r\n\r\n Forbidden = 403,\r\n\r\n NotFound = 404,\r\n\r\n /**\r\n * Date received by the server was invalid.\r\n * Should normally be checked by client before sending.\r\n *\r\n * Might occur when Box or OneDrive refuse to create file/folder with a certain name.\r\n */\r\n UnprocessableEntity = 422,\r\n\r\n /**\r\n * Dependencies prevent the server from accepting the request,\r\n * ie. an object cannot be deleted because there are sub objects.\r\n */\r\n FailedDependency = 424,\r\n\r\n /**\r\n * Dependencies prevent the server from accepting the request,\r\n * but the operation could take care of those dependencies, too.\r\n * For instance, there are sub objects that could be submitted or deleted together with the main object.\r\n *\r\n * However, the user should be asked first in this case.\r\n */\r\n PreconditionRequired = 428,\r\n\r\n ServerError = 500\r\n}\r\n","import ko from \"knockout\";\r\n\r\nimport IRemoteServer, { ExpectedReturnType } from \"./IRemoteServer\";\r\nimport RemoteError from \"./RemoteError\";\r\n\r\nimport DownloadHelper from \"app/helper/DownloadHelper\";\r\nimport { ERROR_POPUP_TEMPLATE } from \"app/viewModel/popup/ErrorPopup\";\r\nimport lazyTemplate from \"ext/knockout-extensions/knockout-lazy-template\";\r\nimport log from \"loglevel\";\r\n\r\nenum HttpMethod {\r\n PATCH = \"PATCH\",\r\n PUT = \"PUT\",\r\n POST = \"POST\",\r\n DELETE = \"DELETE\",\r\n GET = \"GET\",\r\n}\r\n\r\nexport default class RemoteServer implements IRemoteServer {\r\n private _pathBase?: string;\r\n private _publicServerName: string;\r\n private _antiForgeryToken: string;\r\n private _deployId: string;\r\n private _devServerUrl: string;\r\n\r\n constructor(templatesToLoadOnInit: string[] = []) {\r\n /* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n /* eslint-disable @typescript-eslint/ban-ts-comment */\r\n // @ts-ignore: is globally set in _Layout.cshtml\r\n this._pathBase = BASE_URL && BASE_URL !== \"/\" ? BASE_URL : \"\";\r\n // @ts-ignore: is globally set in _Layout.cshtml\r\n this._publicServerName = PUBLIC_SERVER_NAME ?? undefined;\r\n // @ts-ignore => is globally set in _Layout.cshtml\r\n this._antiForgeryToken = TOKEN_HEADER_VALUE ?? \"\";\r\n // @ts-ignore => is globally set in _Layout.cshtml\r\n this._deployId = DEPLOY_ID;\r\n // @ts-ignore => is globally set by webpack dev, or null on prod\r\n this._devServerUrl = typeof DEV_SERVER_URL !== \"undefined\" ? DEV_SERVER_URL : null;\r\n /* eslint-enable @typescript-eslint/no-unsafe-assignment */\r\n /* eslint-enable @typescript-eslint/ban-ts-comment */\r\n\r\n lazyTemplate(\r\n async (templateName: string) => this._loadTemplate(templateName),\r\n [{ name: ERROR_POPUP_TEMPLATE }].concat(\r\n templatesToLoadOnInit.map((t) => {\r\n return { name: t };\r\n })\r\n )\r\n );\r\n }\r\n\r\n private async _loadTemplate(templateName: string) {\r\n const base = new URL(this._pathBase, this._devServerUrl ?? window.location.origin);\r\n const url = new URL(`templates/${ko.unwrap(templateName)}.html?deployId=${this._deployId}`, base);\r\n try {\r\n const response = await fetch(url, { method: HttpMethod.GET });\r\n if (!response.ok) {\r\n throw new RemoteError(response.status, response.statusText, await response.text());\r\n }\r\n const result = response.text();\r\n return await result;\r\n } catch (error) {\r\n log.error(error);\r\n return \"\";\r\n }\r\n }\r\n\r\n public getAntiForgeryHeader() {\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n return { RequestVerificationToken: this._antiForgeryToken };\r\n }\r\n\r\n public getQueryVariable(variable: string): string | undefined {\r\n const query = window.location.search.substring(1);\r\n const vars = query.split(\"&\");\r\n\r\n for (const item of vars) {\r\n const pair = item.split(\"=\");\r\n if (pair[0] === variable) {\r\n return decodeURIComponent(pair[1]);\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n public getBaseAppUrl(): string {\r\n const newUrl = `${window.location.origin}/${this._pathBase}`;\r\n if (window.location.pathname.indexOf(\"/data\") >= 0) {\r\n return newUrl + \"/data\";\r\n } else {\r\n return newUrl;\r\n }\r\n }\r\n\r\n public getForwardUrlWithLogin(): string {\r\n const newUrl = `${window.location.origin}/${this._pathBase}/SignIn`;\r\n return `${newUrl}?ReturnUrl=${window.location.pathname}${window.location.search}`;\r\n }\r\n\r\n public createAbsoluteUrl(url: string): string {\r\n return `${window.location.origin}${this.createRelativeUrl(url)}`;\r\n }\r\n\r\n public createAbsoluteDataUrl(url: string): string {\r\n return `${window.location.origin}${this.createRelativeDataUrl(url)}`;\r\n }\r\n\r\n public createPublicDataUrl(url: string): string {\r\n return this._publicServerName ? `${this._publicServerName}/${url}` : this.createAbsoluteDataUrl(url);\r\n }\r\n\r\n public createRelativeUrl(url: string): string {\r\n return this._getFullPath(url);\r\n }\r\n\r\n public createRelativeDataUrl(url: string): string {\r\n return window.location.origin === this._publicServerName ? this._getFullPath(\"/\" + url) : this._getFullPath(\"/data/\" + url);\r\n }\r\n\r\n /**\r\n * Send data to server via HTTP Put.\r\n * Wrapper around jquery's ajax method, takes care of standard ajax params\r\n * and allows for better testing.\r\n *\r\n * @param url A string containing the URL to which the request is sent.\r\n * @param data The data to be sent. It is converted to JSON in this method.\r\n * @see {@link https://api.jquery.com/jQuery.ajax/}\r\n */\r\n public async post(url: string, data: T): Promise {\r\n return this._fetch(HttpMethod.POST, url, data);\r\n }\r\n\r\n public async put(url: string, data?: T): Promise {\r\n return this._fetch(HttpMethod.PUT, url, data);\r\n }\r\n\r\n public async delete(url: string): Promise {\r\n return this._fetch(HttpMethod.DELETE, url);\r\n }\r\n\r\n public async patch(url: string, data?: T): Promise {\r\n return this._fetch(HttpMethod.PATCH, url, data);\r\n }\r\n\r\n /**\r\n * Load data from the server using a HTTP GET request\r\n *\r\n * @param url A string containing the URL to which the request is sent.\r\n */\r\n public async get(url: string, expectedContent = ExpectedReturnType.JSON): Promise {\r\n return this._fetch(HttpMethod.GET, url, undefined, expectedContent);\r\n }\r\n\r\n public async getArray(url: string): Promise {\r\n const result = await this.get(url);\r\n if (Array.isArray(result)) {\r\n return result as T[];\r\n } else {\r\n throw new Error(\"Unexpected format returned from server, array expected\");\r\n }\r\n }\r\n\r\n public async downloadViaPost(url: string, filename: string, data?: any): Promise {\r\n return this._download(HttpMethod.POST, url, filename, data);\r\n }\r\n\r\n public async downloadViaGet(url: string, filename: string): Promise {\r\n return this._download(HttpMethod.GET, url, filename);\r\n }\r\n\r\n private _getFullPath(path: string): string {\r\n return this._pathBase + path;\r\n }\r\n\r\n private async _fetch(method: HttpMethod, url: string, data?: any, expectedContent = ExpectedReturnType.JSON): Promise {\r\n // Make sure a simple 0 is still serialized!\r\n const jsonData = data !== \"null\" ? JSON.stringify(data) : undefined;\r\n // Header should NOT be camecase, so let's convince typescript that it is okay here ...\r\n /* eslint-disable @typescript-eslint/naming-convention */\r\n const headers = {\r\n \"Content-Type\": \"application/json; charset=utf-8\",\r\n ...this.getAntiForgeryHeader(),\r\n Accept: this._getAcceptHeader(expectedContent),\r\n };\r\n /* eslint-enable @typescript-eslint/naming-convention */\r\n\r\n const response = await fetch(this.createRelativeUrl(url), {\r\n method,\r\n headers,\r\n body: jsonData,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new RemoteError(response.status, response.statusText, await response.text());\r\n }\r\n if (response.status === 204) {\r\n // No response expected => do not try to parse the response as json.\r\n return null;\r\n }\r\n try {\r\n const result = expectedContent === ExpectedReturnType.JSON ? response.json() : response.text();\r\n return (await result) as T;\r\n } catch (error) {\r\n throw new Error(`Server returned unexpected data, expected ${expectedContent}`);\r\n }\r\n }\r\n\r\n private _getAcceptHeader(expectedContent: ExpectedReturnType): string {\r\n switch (expectedContent) {\r\n case ExpectedReturnType.JSON:\r\n return \"application/json; charset=utf-8\";\r\n case ExpectedReturnType.HTML:\r\n return \"text/html; charset=utf-8\";\r\n default:\r\n return \"text/plain; charset=utf-8\";\r\n }\r\n }\r\n\r\n private async _download(method: HttpMethod, url: string, filename: string, htmlBody?: any): Promise {\r\n const jsonData = htmlBody ? JSON.stringify(htmlBody) : undefined;\r\n return new Promise((resolve, reject) => {\r\n void $.ajax(this.createRelativeUrl(url), {\r\n contentType: \"application/json; charset=utf-8\",\r\n data: jsonData,\r\n headers: this.getAntiForgeryHeader(),\r\n type: method,\r\n xhrFields: {\r\n responseType: \"blob\",\r\n },\r\n })\r\n .done((data, status, xhr) => {\r\n const disposition = xhr.getResponseHeader(\"Content-Disposition\");\r\n if (disposition && disposition.includes(\"attachment\")) {\r\n const filenameRegex = /filename[^;=\\n]*=((['\"]).*?\\2|[^;\\n]*)/;\r\n const matches = filenameRegex.exec(disposition);\r\n if (matches && matches[1]) {\r\n filename = matches[1].replace(/['\"]/g, \"\");\r\n }\r\n }\r\n DownloadHelper(data, filename);\r\n resolve();\r\n })\r\n .fail((xhr) => reject(new RemoteError(xhr.status, xhr.statusText, xhr.responseText)));\r\n });\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-unsafe-call */\r\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\r\nimport ko, { MaybeSubscribable } from \"knockout\";\r\nimport log from \"loglevel\";\r\n\r\n/*\r\n===============================================================================\r\n Author: Loïc Faure-Lacroix loicfl@gmail.com\r\n License: MIT (http://opensource.org/licenses/mit-license.php)\r\n\r\n Description: Lazy template loading Library for KnockoutJS\r\n===============================================================================\r\n https://github.com/llacroix/knockout-lazy-template\r\n===============================================================================\r\n*/\r\n\r\nexport interface IInitializable {\r\n init(): void | Promise;\r\n}\r\n\r\nexport interface ITemplateInitializer {\r\n name: string;\r\n viewModel?: IInitializable;\r\n}\r\n\r\nexport default function (loader: (templateName: string) => Promise, loadAtInit: ITemplateInitializer[]) {\r\n const EMPTY_TEMPLATE = \"empty\";\r\n\r\n function getTemplateId(name: string) {\r\n return \"ko-lazy-\" + name.replace(/\\//g, \"-\");\r\n }\r\n\r\n function appendTemplate(name: string, data: string) {\r\n name = getTemplateId(name);\r\n\r\n const scriptTag = document.createElement(\"script\");\r\n const head = document.getElementsByTagName(\"head\")[0];\r\n\r\n scriptTag.id = name;\r\n scriptTag.type = \"text/html\";\r\n scriptTag.innerHTML = data;\r\n\r\n head.appendChild(scriptTag);\r\n }\r\n\r\n function getTemplate(name: string): () => string {\r\n return () => {\r\n const loaded = ko.observable(false as boolean);\r\n const templateId = getTemplateId(name);\r\n const template = document.getElementById(templateId);\r\n\r\n if (template) {\r\n loaded(true);\r\n } else {\r\n loader(name)\r\n .then((data) => {\r\n appendTemplate(name, \"\\n\" + data);\r\n loaded(true);\r\n\r\n }).catch((error) => {\r\n log.error(error);\r\n alert(error.message);\r\n });\r\n }\r\n\r\n return ko.computed(() => {\r\n if (loaded()) {\r\n return templateId;\r\n } else {\r\n return getTemplateId(EMPTY_TEMPLATE);\r\n }\r\n })();\r\n };\r\n }\r\n\r\n appendTemplate(EMPTY_TEMPLATE, \" \");\r\n if (loadAtInit) {\r\n loadAtInit.forEach((i) => getTemplate(i.name)());\r\n }\r\n\r\n ko.bindingHandlers[\"lazy-template\"] = {\r\n init(\r\n element: Node,\r\n valueAccessor: () => MaybeSubscribable\r\n ) {\r\n const viewModel = ko.unwrap(valueAccessor().data);\r\n const name = getTemplate(ko.unwrap(valueAccessor().name));\r\n const obj = ko.observable({\r\n data: viewModel,\r\n name,\r\n });\r\n if (viewModel && typeof viewModel.init === \"function\") {\r\n viewModel.init($(element));\r\n }\r\n return ko.bindingHandlers.template.init(element, obj);\r\n },\r\n update(element, valueAccessor, allBindings, data, bindingContext) {\r\n const viewModel = ko.unwrap(valueAccessor().data);\r\n const name = getTemplate(ko.unwrap(valueAccessor().name));\r\n const obj = ko.observable({\r\n data: viewModel,\r\n name,\r\n });\r\n return ko.bindingHandlers.template.update(element, obj, allBindings, viewModel, bindingContext);\r\n }\r\n };\r\n\r\n ko.virtualElements.allowedBindings[\"lazy-template\"] = true;\r\n}\r\n","import ko, { Observable } from \"knockout\";\r\n\r\nimport IPopup from \"./IPopup\";\r\nimport IRole from \"app/model/masterdata/Role\";\r\n\r\nexport default class RoleSelectionPopup implements IPopup {\r\n\r\n public get templateName() { return \"RoleSelectionPopup\"; }\r\n\r\n public roleId: Observable = ko.observable();\r\n public roles: IRole[];\r\n\r\n private _onClose: (response: number) => void;\r\n\r\n\r\n public constructor(roles: IRole[]) {\r\n this.roles = roles;\r\n this.roleId(roles?.[0].id)\r\n }\r\n\r\n public async showInPopup(): Promise {\r\n return new Promise((resolve) => {\r\n this._onClose = resolve;\r\n });\r\n }\r\n\r\n public close(): Promise {\r\n if (this._onClose) {\r\n this._onClose(undefined);\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n public confirm(): Promise {\r\n if (this._onClose) {\r\n this._onClose(this.roleId());\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n}\r\n","import ICollaborator from \"app/model/masterdata/Collaborator\";\r\nimport { Operation, Privilege } from \"app/auth/AuthConstants\";\r\nimport ISynthesisTechnique from \"app/model/masterdata/SynthesisTechnique\";\r\nimport ISynthesisInstrument from \"app/model/masterdata/SynthesisInstrument\";\r\nimport IUserPrivilege from \"app/model/masterdata/UserPrivilege\";\r\nimport { Technique } from \"app/model/Constants\";\r\nimport IUserSettings from \"app/model/settings/UserSettings\";\r\nimport ICollaboratorRepository from \"app/repository/CollaboratorRepository\";\r\nimport RoleSelectionPopup from \"app/viewModel/popup/RoleSelectionPopup\";\r\nimport IMainView from \"app/viewModel/base/IMainView\";\r\nimport IProjectRepository from \"app/repository/ProjectRepository\";\r\nimport SynthesisInstrumentHelper from \"app/helper/SynthesisInstrumentHelper\";\r\nimport ApplicationError from \"app/model/error/ApplicationError\";\r\nimport SignInAsPopup from \"app/viewModel/popup/SignInAsPopup\";\r\nimport IRole from \"app/model/masterdata/Role\";\r\n\r\nexport default interface IUserManager {\r\n settings: IUserSettings;\r\n id: string;\r\n currentUserEppn: string;\r\n currentUser: ICollaborator;\r\n techniques: ISynthesisTechnique[];\r\n instruments: ISynthesisInstrument[];\r\n privileges: IUserPrivilege[];\r\n isInHouse: boolean;\r\n canUseBulk: boolean;\r\n isAnonymous: boolean;\r\n canSignInAs: boolean;\r\n isUsingSignInAs: boolean;\r\n canSwitchRole: boolean;\r\n\r\n /**\r\n * true if a user can access unpublished data at least an their own projects.\r\n * use isAuthorized(Privilege.AccessUnpublishedData) if checking for general privileges\r\n */\r\n canAccessUnpublishedData: boolean;\r\n\r\n currentUserName: string;\r\n currentRole: string;\r\n\r\n /** Check once if there are projects at all where the current user can create samples */\r\n canCreateSamples: boolean;\r\n\r\n getAllResearchers(): ICollaborator[];\r\n /** Filter for researchers which are active, i.e. have a valid login and thus are expected to create data */\r\n getActiveResearchers(): ICollaborator[];\r\n getAllFaculty(): ICollaborator[];\r\n /** Filter for faculty which are active, i.e. have a valid login and thus are expected to create data */\r\n getActiveFaculty(): ICollaborator[];\r\n getAllStaff(): ICollaborator[];\r\n\r\n getUserInstruments(techniqueIds: string[]): ISynthesisInstrument[];\r\n\r\n /**\r\n * Check if the current user has a certain privilege\r\n *\r\n * @param privilege\r\n * @param op Operation, checks for read access by default.\r\n */\r\n isAuthorized(privilege: Privilege, op?: Operation): boolean;\r\n\r\n /**\r\n * Check if the has one of those privileges, or if they are assigned to any projects with a role that would give them that privileges on the project.\r\n *\r\n * @param privileges\r\n * @param op\r\n */\r\n existsProjectWith(privileges: Privilege[], op: Operation): Promise;\r\n\r\n /**\r\n * Checks if the user has any customizing privilegs,\r\n * i.e. if the customizing dialog would show anything at all.\r\n */\r\n hasAnyCustomizingPrivilege(): boolean;\r\n\r\n /**\r\n * Return true for user roles that are normally assigned to projects, ie. Faculty, Researchers, Instrument Managers, or Community users.\r\n * Excludes technical users like Admin, Data Manager, etc.\r\n */\r\n canHaveOwnProjects(): boolean;\r\n\r\n /**\r\n * Load a user (PI, other collaborator), and keep the name in the cache,\r\n * so the ID can be transleted to a name elsewhere.\r\n * @param user\r\n */\r\n loadUser(user: string): Promise;\r\n\r\n getFullNames(data: string | string[]): string;\r\n\r\n /**\r\n * If instruments and techniques have been loaded, let the user manager\r\n * check which are assigned to the user and have those available.\r\n *\r\n * @param techniques\r\n * @param instruments\r\n */\r\n setTechniques(techniques: ISynthesisTechnique[], instruments: ISynthesisInstrument[]): void;\r\n}\r\n\r\nexport class UserManager implements IUserManager {\r\n private _currentUser?: ICollaborator;\r\n private _faculty: ICollaborator[];\r\n private _researchers: ICollaborator[];\r\n private _staff: ICollaborator[];\r\n private _users: ICollaborator[];\r\n private _userTechniques: ISynthesisTechnique[];\r\n private _userInstruments: ISynthesisInstrument[];\r\n private _privileges: IUserPrivilege[];\r\n private _canCreateSamples: boolean;\r\n private _canAccessUnpublishedData: boolean;\r\n private _canSwitchRoles: boolean;\r\n\r\n private readonly _repo: ICollaboratorRepository;\r\n private readonly _projectRepo: IProjectRepository;\r\n private readonly _mainView: IMainView;\r\n private readonly _signinAsPopup: SignInAsPopup;\r\n\r\n public constructor(\r\n repo: ICollaboratorRepository,\r\n projectRepo: IProjectRepository,\r\n mainView: IMainView,\r\n signinAsPopup: SignInAsPopup\r\n ) {\r\n this._repo = repo;\r\n this._projectRepo = projectRepo;\r\n this._mainView = mainView;\r\n this._signinAsPopup = signinAsPopup;\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n this.signInAs = this.signInAs.bind(this);\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n this.stopSignInAs = this.stopSignInAs.bind(this);\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n this.switchRole = this.switchRole.bind(this);\r\n }\r\n\r\n /**\r\n * true if this is a kind of user that would normally have own projects,\r\n * i.e. Faculty, Researcher or any community user who has an ID\r\n *\r\n * Only for those are asked if they want to see their own projects or all projects.\r\n */\r\n public canHaveOwnProjects(): boolean {\r\n if (this._currentUser.roles.some((r) => r.isFaculty || r.isResearcher)) {\r\n return true;\r\n }\r\n if (this._currentUser.roles.some((r) => !r.isInhouse) && this.id !== \"-\") {\r\n return true;\r\n }\r\n return false;\r\n }\r\n\r\n public async load(loadStaff = false, checkCanCreateAnySample = false): Promise {\r\n const [user, staff, canCreateSamples, canAccessUnpublishedData] = await Promise.all([\r\n this._repo.getCurrent(),\r\n loadStaff ? this._repo.getStaff() : Promise.resolve([] as ICollaborator[]),\r\n // if the user cannot create samples on all projects, the project lookup will limit it automatically.\r\n // But we should make sure that there are indeed projects where the user can create samples.\r\n // Otherwise, the activity should be unavailble!\r\n checkCanCreateAnySample\r\n ? this.existsProjectWith([Privilege.Sample, Privilege.ProcessingActivity], Operation.Create)\r\n : Promise.resolve(false),\r\n // Check if the user can access also unpblished data (be it on their user project or in general)\r\n checkCanCreateAnySample\r\n ? this.existsProjectWith([Privilege.AccessUnpublishedData], Operation.Read)\r\n : Promise.resolve(false),\r\n ]);\r\n\r\n this._currentUser = user;\r\n this._canSwitchRoles = user.canSwitchRoles;\r\n // If user already selected a role, or if there is only one available, we can proceed\r\n let actualRole = user.selectedRole ?? (user.roles.length === 1 ? user.roleIds[0] : null);\r\n // actualRole can be 0 here, no the usual JS comparison won't work!\r\n if (actualRole === null) {\r\n // Otherwise, let the user select now.\r\n actualRole = await this._requestUserRole(user.roles);\r\n }\r\n this._currentUser.roleIds = [actualRole];\r\n this._currentUser.roles = user.roles.filter((r) => r.id === actualRole);\r\n this._privileges = user.roles.find((r) => r.id === actualRole).privileges;\r\n\r\n this._researchers = staff\r\n .filter((c) => c.roles.some((r) => r.isResearcher))\r\n .sort((a, b) => a.lastName.localeCompare(b.lastName));\r\n this._faculty = staff.filter((c) => c.roles.some((r) => r.isFaculty)).sort((a, b) => a.lastName.localeCompare(b.lastName));\r\n this._staff = staff;\r\n this._users = [];\r\n this._canCreateSamples = canCreateSamples;\r\n this._canAccessUnpublishedData = canAccessUnpublishedData;\r\n }\r\n\r\n public async loadUser(userId: string): Promise {\r\n let user = this._users.find((u) => u.id === userId);\r\n if (!user) {\r\n user = await this._repo.get(userId);\r\n if (user) {\r\n this._users.push(user);\r\n }\r\n }\r\n return user;\r\n }\r\n\r\n public setTechniques(allTechniques: ISynthesisTechnique[], allInstruments: ISynthesisInstrument[]): void {\r\n if (this.isAuthorized(Privilege.UseAnySynthesisTechnique)) {\r\n this._userTechniques = allTechniques;\r\n } else {\r\n this._userTechniques = allTechniques.filter((s) =>\r\n this._currentUser.techniques.some((t) => t === s.id || t === s.parentTechnique)\r\n );\r\n }\r\n\r\n this._userInstruments = SynthesisInstrumentHelper.getInstrumentsByTechnique(\r\n allInstruments,\r\n this._userTechniques,\r\n this._userTechniques.map((t) => t.id)\r\n );\r\n }\r\n\r\n public get settings() {\r\n return this._currentUser.settings;\r\n }\r\n\r\n public set settings(settings: IUserSettings) {\r\n this._currentUser.settings = settings;\r\n }\r\n\r\n public get currentUser(): ICollaborator {\r\n return this._currentUser;\r\n }\r\n public get techniques(): ISynthesisTechnique[] {\r\n return this._userTechniques || [];\r\n }\r\n public get instruments(): ISynthesisInstrument[] {\r\n return this._userInstruments || [];\r\n }\r\n public get isInHouse() {\r\n return this._currentUser.roles.some((r) => r.isInhouse);\r\n }\r\n\r\n public get currentRole() {\r\n return this.currentUser.roles[0].name;\r\n }\r\n\r\n public get currentUserName() {\r\n return this.currentUser.fullName ?? this.getFullNames(this.currentUser.id);\r\n }\r\n\r\n public get currentUserEppn() {\r\n return this.currentUser.eppn ?? this.currentUser.login;\r\n }\r\n\r\n public get isAnonymous() {\r\n return this._currentUser.id === \"-\";\r\n }\r\n\r\n public get canSignInAs() {\r\n return !this.isUsingSignInAs && this.isAuthorized(Privilege.SignInAs);\r\n }\r\n\r\n public get isUsingSignInAs() {\r\n return this._currentUser.usingSignInAs;\r\n }\r\n\r\n public get canSwitchRole() {\r\n return this._canSwitchRoles;\r\n }\r\n\r\n public get canUseBulk() {\r\n return (\r\n this.isAuthorized(Privilege.UseAnySynthesisTechnique) || this.techniques.some((t) => t.id === Technique.Bulk.toString())\r\n );\r\n }\r\n\r\n public get canCreateSamples() {\r\n return this._canCreateSamples;\r\n }\r\n public get canAccessUnpublishedData() {\r\n return this._canAccessUnpublishedData;\r\n }\r\n\r\n public get id(): string {\r\n return this._currentUser.id;\r\n }\r\n\r\n public get privileges(): IUserPrivilege[] {\r\n return this._privileges || [];\r\n }\r\n\r\n public getAllResearchers(): ICollaborator[] {\r\n return this._researchers.slice() || [];\r\n }\r\n\r\n public getActiveResearchers(): ICollaborator[] {\r\n return this.getAllResearchers()\r\n .filter((u) => u.login || u.eppn) // not null and not empty is what we want here\r\n .sort((a, b) => a.lastName.localeCompare(b.lastName));\r\n }\r\n\r\n public getAllFaculty(): ICollaborator[] {\r\n return this._faculty.slice() || [];\r\n }\r\n\r\n public getActiveFaculty(): ICollaborator[] {\r\n return this.getAllFaculty()\r\n .filter((u) => u.login || u.eppn)\r\n .sort((a, b) => a.lastName.localeCompare(b.lastName));\r\n }\r\n\r\n public getAllStaff(): ICollaborator[] {\r\n return this._staff.slice() || [];\r\n }\r\n\r\n public hasAnyCustomizingPrivilege() {\r\n return (\r\n this.isAuthorized(Privilege.SynthesisInstrument, Operation.Read) ||\r\n this.isAuthorized(Privilege.SynthesisTechnique, Operation.Read) ||\r\n this.isAuthorized(Privilege.CharacterizationInstrument, Operation.Read) ||\r\n this.isAuthorized(Privilege.CharacterizationTechnique, Operation.Read) ||\r\n this.isAuthorized(Privilege.ResearchGroup, Operation.Read) ||\r\n this.isAuthorized(Privilege.Material, Operation.Read) ||\r\n this.isAuthorized(Privilege.BulkRawMaterial, Operation.Read) ||\r\n this.isAuthorized(Privilege.Substrate, Operation.Read) ||\r\n this.isAuthorized(Privilege.User, Operation.Read) ||\r\n this.isAuthorized(Privilege.Role, Operation.Read)\r\n );\r\n }\r\n\r\n public getFullNames(data: string | string[]): string {\r\n if (!data) {\r\n return \"tbd\";\r\n }\r\n const userIds: string[] = Array.isArray(data) ? data : [data];\r\n return userIds\r\n .map((userId) => {\r\n const collaborator =\r\n this._staff.find((user) => user.id === userId || \" \" + user.id === userId) ??\r\n this._users.find((user) => user.id === userId || \" \" + user.id === userId);\r\n return collaborator?.fullName ?? userId;\r\n })\r\n .join(\", \");\r\n }\r\n\r\n public get isBulkUser() {\r\n return (\r\n this._currentUser.techniques.some((t) => t === Technique.Bulk.toString()) ||\r\n this.isAuthorized(Privilege.UseAnySynthesisTechnique)\r\n );\r\n }\r\n\r\n public isAuthorized(privilege: Privilege, op: Operation = Operation.Read): boolean {\r\n return UserManager.isAuthorized(this._privileges, privilege, op);\r\n }\r\n\r\n public static isAuthorized(allPrivilege: IUserPrivilege[], privilege: Privilege, op: Operation): boolean {\r\n const p = allPrivilege.find((p) => p.name === privilege);\r\n if (!p) {\r\n return false;\r\n }\r\n return p.rights?.indexOf(op) > -1;\r\n }\r\n\r\n public existsProjectWith(privilege: Privilege[], op: Operation): Promise {\r\n return this._projectRepo.existsProjectWith(privilege, op);\r\n }\r\n\r\n public getUserInstruments(techniqueIds: string[]): ISynthesisInstrument[] {\r\n return SynthesisInstrumentHelper.getInstrumentsByTechnique(this._userInstruments, this._userTechniques, techniqueIds);\r\n }\r\n\r\n /**\r\n * * Bound to View via knockout data - binding\r\n */\r\n public async signInAs() {\r\n try {\r\n const signInAs = await this._mainView.openPopup(this._signinAsPopup);\r\n if (!signInAs) {\r\n // user canceled\r\n return;\r\n }\r\n const message = await this._repo.signInAs(signInAs.userId, signInAs.roleId);\r\n if (message) {\r\n this._mainView.showError(new ApplicationError(\"Sign in As\", message));\r\n } else {\r\n window.location.reload();\r\n }\r\n } catch (error) {\r\n this._mainView.showError(error);\r\n }\r\n }\r\n\r\n /**\r\n * * Bound to View via knockout data - binding\r\n */\r\n public async stopSignInAs() {\r\n try {\r\n const doIt = await this._mainView.askUserIfContinue(\r\n \"Stop Sign In As\",\r\n \"Do you want to stop the sign-in-as-mode and return to you own login and role?\",\r\n \"This will reload the webpage, unsaved modification might be lost.\"\r\n );\r\n if (doIt) {\r\n const message = await this._repo.stopSignInAs();\r\n if (message) {\r\n this._mainView.showError(new ApplicationError(\"Sign in As\", message));\r\n } else {\r\n window.location.reload();\r\n }\r\n }\r\n } catch (error) {\r\n this._mainView.showError(error);\r\n }\r\n }\r\n\r\n /**\r\n * * Bound to View via knockout data - binding\r\n */\r\n public async switchRole() {\r\n const roles = await this._repo.getRoles();\r\n const selected = await this._requestUserRole(roles);\r\n if (selected !== this._currentUser.roleIds[0]) {\r\n window.location.reload();\r\n }\r\n }\r\n\r\n private async _requestUserRole(roles: IRole[]) {\r\n const popup = new RoleSelectionPopup(roles);\r\n const selectedRole = await this._mainView.openPopup(popup);\r\n const message = await this._repo.selectRole(selectedRole);\r\n if (message) {\r\n throw new ApplicationError(\"Sign in As\", message);\r\n }\r\n return selectedRole;\r\n }\r\n}\r\n","import { ICreatePublicationRequest } from \"app/model/Publication\";\r\n\r\nexport function isBibTexFormat(content: string): boolean {\r\n return /\\s*@article/i.test(content);\r\n}\r\n\r\nexport function parseBibTex(content: string): ICreatePublicationRequest {\r\n let title = extract(\"title\", content);\r\n title = title?.replace(/–/g, \"-\");\r\n title = title?.replace(/{,}/g, \",\");\r\n const journal = extract(\"journal\", content);\r\n const year = extractNumber(\"year\", content);\r\n\r\n const volume = extractVolumeInfo(content);\r\n\r\n\r\n const doi = extract(\"doi\", content).replace(\"https://doi.org/\",\"\");\r\n\r\n const authors = extract(\"author\", content)?.split(\" and \");\r\n const authorstring = authors.map((a) => formatAuthor(a)).join(\", \");\r\n\r\n const citation = `${authorstring}, \"${title},\" ${journal} ${volume}(${year}). ${doi}.`;\r\n\r\n const model: ICreatePublicationRequest = {\r\n description: \"\",\r\n authors: authorstring,\r\n cite: citation,\r\n doi: doi,\r\n type: undefined,\r\n journal: journal,\r\n scienceDriverIds: [],\r\n title: title,\r\n year: year,\r\n projectIds: [],\r\n };\r\n return model;\r\n}\r\n\r\nfunction extractVolumeInfo(content: string): string {\r\n const volume = extractNumber(\"volume\", content);\r\n if (!volume) {\r\n return \"\"\r\n }\r\n let issue = extract(\"issue\", content) ?? \"\";\r\n if (!issue) {\r\n issue = extract(\"number\", content) ?? \"\";\r\n }\r\n if (issue) {\r\n issue = \"(\" + issue + \")\";\r\n }\r\n const pages = extract(\"pages\", content);\r\n if (!pages) {\r\n return `${volume}${issue} `;\r\n } else {\r\n return `${volume}${issue}, ${pages} `;\r\n }\r\n}\r\n\r\nfunction extract(key: string, content: string) {\r\n const regexForDelimiter = new RegExp(key + `\\\\s*=\\\\s*(.)`);\r\n const delimMatch = content.match(regexForDelimiter)\r\n const startDelim = delimMatch?.length > 1 ? delimMatch[1] : `\"`;\r\n const endDelim = startDelim === '{' ? '}' : '\"';\r\n const regex = new RegExp(key + `\\\\s*=\\\\s*${startDelim}([^${endDelim}]*)${endDelim}`, \"i\");\r\n\r\n const match = content.match(regex);\r\n return match?.length > 1 ? match[1] : null;\r\n}\r\n\r\nfunction extractNumber(key: string, content: string) {\r\n const extracted = extract(key, content);\r\n return extracted ? parseInt(extracted) : null;\r\n}\r\nfunction formatAuthor(str: string): string {\r\n const lastcommafirst = str.split(\", \");\r\n if (lastcommafirst.length > 1) {\r\n const initials = lastcommafirst[1]\r\n .split(\" \")\r\n .map((first) => first.charAt(0).toUpperCase() + \".\")\r\n .join(\"\");\r\n return `${initials} ${lastcommafirst[0]}`;\r\n } else {\r\n const names = str.split(\" \");\r\n const initials = names.slice(0, -1)\r\n .map((first) => first.charAt(0).toUpperCase() + \".\")\r\n .join(\"\");\r\n return `${initials} ${names.slice(-1)[0]}`;\r\n\r\n if (lastcommafirst.length === 1) { return str; }\r\n }\r\n}\r\n","import { ICreatePublicationRequest } from \"app/model/Publication\";\r\nimport { parse as parseRis } from \"astrocite-ris\";\r\nimport { parse as parseBibTex } from \"astrocite-bibtex\";\r\nimport { Person } from \"csl-json\";\r\nimport ApplicationError from \"app/model/error/ApplicationError\";\r\n\r\nexport function isRisCitation(content: string): boolean {\r\n return /\\s*ER\\s+-/i.test(content);\r\n}\r\n\r\nexport function isBibTexFormat(content: string): boolean {\r\n return /\\s*@article/i.test(content);\r\n}\r\n\r\n\r\nexport function parseCitation(content: string): ICreatePublicationRequest {\r\n const cslJson = isRisCitation(content) ? parseRis(content) :\r\n isBibTexFormat(content) ? parseBibTex(content) : null;\r\n if (cslJson === null) {\r\n return null;\r\n }\r\n\r\n if (cslJson.length !== 1) {\r\n throw new ApplicationError(\"Can only read single publications\")\r\n }\r\n const cslData = cslJson[0];\r\n\r\n const authors = cslData.author.map((author) => formatAuthor(author)).join(\", \");\r\n const year = extractYear(cslData.issued);\r\n const citation = `${authors}, \"${cslData.title},\" ${cslData[\"container-title\"]} ${formatVolumeInfo(\r\n cslData\r\n )}(${year}). ${formatDoi(cslData.DOI)}.`;\r\n\r\n const model: ICreatePublicationRequest = {\r\n description: \"\",\r\n authors: authors,\r\n cite: citation,\r\n doi: formatDoi(cslData.DOI),\r\n type: undefined,\r\n journal: cslData[\"container-title\"],\r\n scienceDriverIds: [],\r\n title: cslData.title,\r\n year: year,\r\n projectIds: [],\r\n };\r\n return model;\r\n}\r\n\r\nfunction formatDoi(doi: string): string {\r\n return doi.replace(\"https://doi.org/\", \"\");\r\n}\r\n\r\nfunction extractYear(cslData: CSL.Date): number {\r\n if (cslData[\"date-parts\"] && cslData[\"date-parts\"].length > 0) {\r\n const date = cslData[\"date-parts\"][0];\r\n if (date) {\r\n return convertToNumber(date[0]);\r\n }\r\n } else if (cslData.raw) {\r\n return convertToNumber(cslData.raw.substring(0,4))\r\n }\r\n return -1;\r\n}\r\n\r\nfunction formatVolumeInfo(data: CSL.Data): string | undefined {\r\n const volume = data.volume;\r\n if (!volume) {\r\n return \"\";\r\n }\r\n const issue = data.issue ?? data.number;\r\n\r\n const page1 = data.page ?? data[\"page-first\"];\r\n const first = convertToNumber(page1);\r\n const last = first && data[\"number-of-pages\"] ? first + convertToNumber(data[\"number-of-pages\"]) : null;\r\n const pages = last ? `${first}-${last}` : page1;\r\n\r\n let result = volume?.toString();\r\n if (issue) {\r\n result += `(${issue})`;\r\n }\r\n if (pages) {\r\n result += \", \" + pages;\r\n }\r\n return result + \" \";\r\n}\r\n\r\nfunction formatAuthor(author: Person): string {\r\n return (\r\n author.given\r\n ?.split(\" \")\r\n .map((name) => name.charAt(0).toUpperCase() + \".\")\r\n .join(\"\") +\r\n \" \" +\r\n author.family\r\n );\r\n}\r\n\r\nfunction isString(value: any): value is string {\r\n return typeof value === \"string\";\r\n}\r\n\r\nfunction convertToNumber(value: number | string): number {\r\n if (isString(value)) {\r\n return parseInt(value, 10);\r\n }\r\n return value; // No conversion needed if it's already a number\r\n}\r\n","import { ICreatePublicationRequest, IPublication } from \"app/model/Publication\";\r\nimport ko, { Observable } from \"knockout\";\r\nimport IPopup from \"../popup/IPopup\";\r\nimport sanitize from \"sanitize-html\";\r\nimport { isBibTexFormat, parseBibTex } from \"app/helper/citationParser/Bibtex\";\r\nimport { parse2dccCitation } from \"app/helper/citationParser/2DCC\";\r\nimport IPublicationRepository from \"app/repository/PublicationRepository\";\r\nimport { isRisCitation, parseCitation } from \"app/helper/citationParser/CitationParser\";\r\nimport { Status } from \"app/model/Constants\";\r\n\r\nexport default class NewPublication implements IPopup {\r\n private readonly _sanitizerConfig = {\r\n allowedTags: [\"b\", \"i\", \"em\", \"strong\", \"u\"],\r\n };\r\n\r\n public constructor(repo: IPublicationRepository) {}\r\n\r\n public get templateName() {\r\n return \"public/NewPublication\";\r\n }\r\n\r\n public projectLabels: string[];\r\n public content: Observable = ko.observable();\r\n\r\n private _onSave: (value: IPublication | PromiseLike) => void;\r\n\r\n public async showInPopup(): Promise {\r\n return new Promise((resolve) => {\r\n this._onSave = resolve;\r\n });\r\n }\r\n\r\n public confirm(): Promise {\r\n const content = sanitize(this.content(), this._sanitizerConfig);\r\n let createRequest: ICreatePublicationRequest = null;\r\n if (isBibTexFormat(content)) {\r\n // FIXME: parseCitation could handle that, too, but there are some edge cases where\r\n // that official parser makes mistakes. Like putting middle initials with the last name\r\n // so let's keep our homegrown bibtex parser for now ...\r\n createRequest = parseBibTex(content);\r\n } else if (isRisCitation(content)) {\r\n createRequest = parseCitation(content);\r\n } else {\r\n createRequest = parse2dccCitation(content);\r\n }\r\n if (this._onSave) {\r\n this._onSave(this._convertToPublication(createRequest));\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n public close(): Promise {\r\n if (this._onSave) {\r\n this._onSave(undefined);\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n public onDragOver(_: unknown, event: JQuery.Event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n document.getElementById(\"drop-area\").style.backgroundColor = \"#f0f0f0\";\r\n }\r\n\r\n public onDragLeave(_: unknown, event: JQuery.Event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n document.getElementById(\"drop-area\").style.backgroundColor = \"\";\r\n }\r\n\r\n public onDrop(_: unknown, event: JQuery.Event) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n\r\n const dropArea = document.getElementById(\"drop-area\");\r\n if (dropArea) {\r\n dropArea.style.backgroundColor = \"\";\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\r\n const nativeEvent = (event as any).originalEvent as DragEvent;\r\n\r\n // Handle file drop\r\n const files = nativeEvent.dataTransfer?.files;\r\n if (files && files.length > 0) {\r\n const file = files[0];\r\n this.readFile(file);\r\n }\r\n }\r\n\r\n public readFile(file: File) {\r\n const reader = new FileReader();\r\n\r\n reader.onload = (event: ProgressEvent): void => {\r\n const result = event.target?.result;\r\n if (typeof result === \"string\") {\r\n this.content(result);\r\n }\r\n };\r\n\r\n reader.onerror = function (error) {\r\n console.error(\"Error reading file:\", error);\r\n };\r\n\r\n reader.readAsText(file); // You can also use readAsArrayBuffer, readAsDataURL, etc.\r\n }\r\n\r\n /**\r\n * The parser only returns a createRequest. To feed that into the view model, we need the format the server would return\r\n * ... just adding all those empty arrays.\r\n */\r\n private _convertToPublication(createRequest: ICreatePublicationRequest): IPublication {\r\n return {\r\n ...createRequest,\r\n id: 0,\r\n projects: [],\r\n synthesisInstruments: [],\r\n characterizationInstruments: [],\r\n accessibleProjects: [],\r\n lastChangedByUser: 'n/a',\r\n lastChangedDate: '0',\r\n status: Status.New,\r\n hasData: false,\r\n materials: [],\r\n };\r\n }\r\n}\r\n","import { ICreatePublicationRequest } from \"app/model/Publication\";\r\n\r\nexport function parse2dccCitation(content: string): ICreatePublicationRequest {\r\n content = content.replace(/\\n/g, \" \");\r\n let begin = 0;\r\n\r\n let end = content.search('[\"“]') - 1;\r\n const authors = content.substring(begin, end - 1);\r\n begin = end + 1;\r\n\r\n let remainder = content.substring(begin);\r\n end = begin + remainder.search('[\"”]');\r\n let title = content.substring(begin + 1, end - 1);\r\n begin = end + 1;\r\n\r\n if (title.endsWith(\",\")) {\r\n title = title.substring(0, title.length - 1);\r\n }\r\n\r\n remainder = content.substring(begin);\r\n end = begin + remainder.indexOf(\"
\");\r\n let journal = content.substring(begin, end).trim();\r\n begin = end + 4;\r\n journal = journal.replace(//g, \"\");\r\n if (journal.startsWith(\",\")) {\r\n journal = journal.substring(1);\r\n }\r\n\r\n remainder = content.substring(begin);\r\n begin += remainder.search(\"\\\\([0-9]+\\\\)\\\\.\");\r\n const year = parseInt(content.substring(begin + 1, begin + 5));\r\n begin += 7;\r\n if (content[begin] === \" \") {\r\n begin++;\r\n }\r\n\r\n remainder = content.substring(begin);\r\n end = begin + remainder.search(\"[ <\\n]\");\r\n let doi = content.substring(begin, end);\r\n\r\n if (doi.endsWith(\".\")) {\r\n doi = doi.substring(0, doi.length - 1);\r\n }\r\n\r\n let cite = content.substring(0, end);\r\n if (!cite.endsWith(\".\")) {\r\n cite += \".\";\r\n }\r\n\r\n const desc = content.substring(end);\r\n\r\n const model: ICreatePublicationRequest = {\r\n description: desc,\r\n authors: authors,\r\n cite: cite,\r\n doi: doi,\r\n type: undefined,\r\n journal: journal,\r\n scienceDriverIds: [],\r\n title: title,\r\n year: year,\r\n projectIds: [],\r\n };\r\n return model;\r\n}\r\n","import ko, { Observable, ObservableArray, PureComputed, Subscribable } from \"knockout\";\r\nimport log from \"loglevel\";\r\nimport \"knockout.validation\";\r\n\r\nimport ArrayComparer from \"app/helper/ArrayComparer\";\r\nimport { PublicationType, Status } from \"app/model/Constants\";\r\nimport { IPublication, IUpdatePublicationRequest } from \"app/model/Publication\";\r\n\r\nimport IMaterial, { Material } from \"app/model/masterdata/Material\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\nimport ProjectActivityVM from \"app/viewModel/activity/ProjectActivityVM\";\r\nimport IPopup from \"./popup/IPopup\";\r\nimport ApplicationError from \"app/model/error/ApplicationError\";\r\nimport IPublicationRepository from \"app/repository/PublicationRepository\";\r\nimport IScienceDriver from \"app/model/masterdata/ScienceDriver\";\r\nimport IProjectRepository from \"app/repository/ProjectRepository\";\r\nimport { StatusCode } from \"app/services/remote/RemoteError\";\r\nimport IProject from \"app/model/Project\";\r\nimport { ISelectListEntry, SelectList } from \"app/model/masterdata/SelectList\";\r\nimport { Privilege, Operation } from \"app/auth/AuthConstants\";\r\nimport ITreeObject from \"./tree/ITreeObject\";\r\nimport { DataObject } from \"./base/DataObject\";\r\nimport IPublicMasterData from \"app/services/public/IPublicMasterData\";\r\nimport NewPublication from \"./public/NewPublication\";\r\nimport DataPackageVM from \"./dataPackage/DataPackageVM\";\r\nimport { IDataPackage } from \"app/model/DataPackage\";\r\nimport { deserializeDateTime } from \"app/helper/DateHelper\";\r\nimport ICharacterizationInstrument from \"app/model/masterdata/CharacterizationInstrument\";\r\nimport ISynthesisInstrument from \"app/model/masterdata/SynthesisInstrument\";\r\n\r\ninterface IViewModelFactory {\r\n getDataPackage(owner: PublicationVM, model: IDataPackage): Promise;\r\n}\r\nexport default class PublicationVM extends DataObject implements IPopup, ITreeObject {\r\n templateName = \"public/Popup\";\r\n\r\n public get projectLink(): string {\r\n return this._remote.createRelativeUrl(`/Project?projectId=${this.projectId}`);\r\n }\r\n\r\n public getLink(): string {\r\n return this._remote.createAbsoluteUrl(`/Data?publicationId=${this.doi() ?? this.id}`);\r\n }\r\n\r\n private get _doiLink(): string {\r\n return `https://doi.org/${this.doi()}`;\r\n }\r\n\r\n public projectId: number;\r\n public id: number;\r\n public title: Observable = ko.observable();\r\n public year: Observable = ko.observable();\r\n public type: Observable = ko.observable();\r\n public authors: Observable = ko.observable();\r\n public journal: Observable = ko.observable();\r\n public cite: Observable = ko.observable();\r\n public description: Observable = ko.observable();\r\n public doi: Observable = ko.observable();\r\n public mainScienceDriver: Observable = ko.observable();\r\n public otherScienceDrivers: ObservableArray = ko.observableArray();\r\n public mainScienceDriverText: Subscribable;\r\n public otherScienceDriversText: Subscribable;\r\n public materialIds: ObservableArray = ko.observableArray();\r\n public synthesisInstrumentIds: ObservableArray = ko.observableArray();\r\n public characterizationInstrumentIds: ObservableArray = ko.observableArray();\r\n public synthesisInstruments: ISynthesisInstrument[];\r\n public characterizationInstruments: ICharacterizationInstrument[];\r\n\r\n public link: PureComputed;\r\n public allMaterials: Subscribable = ko.observableArray();\r\n public allSynthesisInstruments: Subscribable = ko.observableArray();\r\n public allCharacterizationInstruments: Subscribable = ko.observableArray();\r\n public allScienceDrivers: IScienceDriver[];\r\n public allJournals: ObservableArray = ko.observableArray();\r\n public allTypes: ISelectListEntry[];\r\n\r\n public hasModifications: Observable = ko.observable(false as boolean);\r\n public submitValidation: ko.validation.ObservableGroup = ko.validatedObservable({});\r\n\r\n public newProject: Observable = ko.observable();\r\n\r\n // This array is used for projects that have been loaded, in order to display the label in the multi-select list.\r\n // So the array of projects contains normally only the selected projects, unless a user removes one.\r\n public projects: ObservableArray = ko.observableArray();\r\n public selectedProjectIds: ObservableArray = ko.observableArray();\r\n public selectedProjectLabels: PureComputed;\r\n\r\n public canCreateMaterial: Observable = ko.observable(false as boolean);\r\n\r\n public typeLabel: PureComputed;\r\n\r\n private readonly _owner: ProjectActivityVM;\r\n private readonly _remote: IRemoteServer;\r\n private readonly _onCreateMaterial: () => Promise;\r\n private readonly _repo: IPublicationRepository;\r\n private readonly _projectRepo: IProjectRepository;\r\n private _viewModelFactory: IViewModelFactory;\r\n\r\n private _isNew: Observable = ko.observable(false as boolean);\r\n private _isDirty: Observable = ko.observable(false as boolean);\r\n\r\n private _onSave: (value: IPublication) => void;\r\n\r\n private _dataPackages: DataPackageVM[];\r\n public get dataPackages() {\r\n return this._dataPackages;\r\n }\r\n\r\n constructor(\r\n remote: IRemoteServer,\r\n repo: IPublicationRepository,\r\n projectRepo: IProjectRepository,\r\n viewModelFactory: IViewModelFactory,\r\n onCreateMaterial?: () => Promise,\r\n owner?: ProjectActivityVM\r\n ) {\r\n super();\r\n this._owner = owner;\r\n if (this._owner) {\r\n this.isSubmitted = this._owner.isSubmitted;\r\n this.isPending = this._owner.isPending;\r\n this.readonly = this._owner.readonly;\r\n } else {\r\n this.status(Status.Submitted);\r\n }\r\n\r\n this._remote = remote;\r\n this._repo = repo;\r\n this._projectRepo = projectRepo;\r\n this._viewModelFactory = viewModelFactory;\r\n this._onCreateMaterial = onCreateMaterial;\r\n }\r\n\r\n public async initViewModel(): Promise {\r\n await super.initViewModel();\r\n this.allMaterials = ko.pureComputed(() => this.masterData.materials());\r\n this.allCharacterizationInstruments = ko.pureComputed(() => this.masterData.characterizationInstruments ?? []);\r\n this.allSynthesisInstruments = ko.pureComputed(() => this.masterData.synthesisInstruments ?? []);\r\n\r\n this.allScienceDrivers = (this.masterData as IPublicMasterData).scienceDrivers ?? [];\r\n this.allJournals((this.masterData as IPublicMasterData).journals ?? []);\r\n this.allTypes = this.masterData.getSelectList(SelectList.PublicationType);\r\n\r\n this.requirePrivilege(Privilege.Publication);\r\n this.canCreateMaterial(this.user.isAuthorized(Privilege.Material, Operation.Create));\r\n\r\n // That only shows/hides the buttons in the tree view. And a publication is either part of the publication activity there,\r\n // and can only be submitted/removed with that activity, root for data packages, where it is an immutable\r\n // There is no point in removing the publication, but keeping that activity.\r\n this.userCanDelete(false);\r\n this.userCanReset(false);\r\n this.userCanSubmit(false);\r\n\r\n this.mainScienceDriverText = ko.pureComputed(\r\n () => this.allScienceDrivers.find((s) => s.id === this.mainScienceDriver())?.label\r\n );\r\n this.otherScienceDriversText = ko.pureComputed(() =>\r\n this.otherScienceDrivers()\r\n .map((id) => this.allScienceDrivers.find((s) => s.id === id).label)\r\n .join(\", \")\r\n );\r\n\r\n // Make sure this observable only notifies observers\r\n // when the set of elements in the array changes.\r\n // knockout default would be to notify whenever the array is manipulated,\r\n // even if the same set of elements is set again\r\n this.materialIds.equalityComparer = ArrayComparer;\r\n this.characterizationInstrumentIds.equalityComparer = ArrayComparer;\r\n this.synthesisInstrumentIds.equalityComparer = ArrayComparer;\r\n this.otherScienceDrivers.equalityComparer = ArrayComparer;\r\n\r\n this.link = ko.pureComputed(() => (this.doi() ? this._doiLink : \"\"));\r\n this.typeLabel = ko.pureComputed(\r\n () => this.allTypes.find((t) => t.key === this.type())?.value\r\n );\r\n this.submitValidation = ko.validatedObservable(this._configureValidation());\r\n }\r\n\r\n public statusText = ko.pureComputed(() => \"\");\r\n public statusToolTip = ko.pureComputed(() => \"\");\r\n public saveWork(): Promise {\r\n return this._owner ? this._owner.saveWork() : Promise.reject(new Error(\"Method not implemented.\"));\r\n }\r\n public submitWork(): Promise {\r\n return Promise.reject(new Error(\"Method not implemented.\"));\r\n }\r\n public deletePending(): Promise {\r\n return Promise.reject(new Error(\"Method not implemented.\"));\r\n }\r\n public resetPending(): Promise {\r\n return Promise.reject(new Error(\"Method not implemented.\"));\r\n }\r\n public saveSuspended: Subscribable = ko.pureComputed(() => false);\r\n\r\n public async showInPopup(): Promise {\r\n return new Promise((resolve) => {\r\n this._onSave = resolve;\r\n });\r\n }\r\n\r\n public close(): Promise {\r\n if (this._onSave) {\r\n this._onSave(undefined);\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n public async confirm(): Promise {\r\n const result = await this._save();\r\n if (result && this._onSave) {\r\n this._onSave(result);\r\n }\r\n }\r\n\r\n public getModel(): IUpdatePublicationRequest {\r\n return {\r\n id: this.id,\r\n description: this.description(),\r\n authors: this.authors(),\r\n cite: this.cite(),\r\n doi: this.doi(),\r\n journal: this.journal(),\r\n materialIds: this.materialIds(),\r\n synthesisInstrumentIds: this.synthesisInstrumentIds(),\r\n characterizationInstrumentIds: this.characterizationInstrumentIds(),\r\n projectIds: this.selectedProjectIds(),\r\n scienceDriverIds: [this.mainScienceDriver()].concat(this.otherScienceDrivers()),\r\n title: this.title(),\r\n type: this.type(),\r\n year: this.year(),\r\n };\r\n }\r\n\r\n /**\r\n * Initializes this view model with a model (loaded from server).\r\n * Sets all fields according to this model, resets validation errors\r\n * and marks this object as unmodified.\r\n *\r\n */\r\n public async initWithModel(model: IPublication): Promise {\r\n try {\r\n await this.setModelData(model);\r\n ko.tasks.runEarly();\r\n // setting model data\r\n // may trigger functions listening to changes (like modification detection).\r\n // Let this happen now, so we can set the object unmodified\r\n // AFTER all this trigger runs. We do not want the entering of model data\r\n // setting an object to modified ...\r\n\r\n this.hasModifications(!model);\r\n this.setChangeTrigger();\r\n if (this.submitValidation.errors) {\r\n this.submitValidation.errors.showAllMessages(false);\r\n }\r\n } catch (error) {\r\n log.trace(error);\r\n this.mainView.showError(error);\r\n }\r\n }\r\n\r\n public canBeSubmitted(): boolean {\r\n if (this.submitValidation && !this.submitValidation.isValid()) {\r\n this.submitValidation.errors.showAllMessages();\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n public async addProject(): Promise {\r\n const label = this.newProject();\r\n if (!label) {\r\n return;\r\n }\r\n try {\r\n const project = await this._projectRepo.get(label);\r\n this.newProject(undefined);\r\n this.projects.push(project);\r\n this.selectedProjectIds.push(project.id);\r\n } catch (error) {\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\r\n if (error.code === (StatusCode.NotFound as number)) {\r\n return this.mainView.showError(\r\n new ApplicationError(\r\n \"Project not found\",\r\n \"Add project to publication\",\r\n `A project with ID ${label} could not be found.`\r\n )\r\n );\r\n }\r\n }\r\n }\r\n\r\n public async addMaterial(): Promise {\r\n const newMaterial = await this._onCreateMaterial();\r\n ko.tasks.runEarly();\r\n this.materialIds.push(newMaterial.id);\r\n }\r\n\r\n public async openNewPublicationPopup(): Promise {\r\n const popup = new NewPublication(this._repo);\r\n const model = await this.mainView.openPopup(popup);\r\n await this.setModelData({ ...model, id: null, status: Status.New, materials: [] });\r\n }\r\n\r\n public async loadCompletely(): Promise {\r\n try {\r\n this.isLoading(true);\r\n const models = await this._repo.getDataPackages(this.id);\r\n this._dataPackages = await Promise.all(models.map(async (model) => this._viewModelFactory.getDataPackage(this, model)));\r\n } finally {\r\n // Let tasks run now, before removing the loading flag.\r\n // That way, we're sure any action that was triggered has been completed\r\n ko.tasks.runEarly();\r\n this.isLoading(false);\r\n }\r\n }\r\n\r\n protected async setModelData(model?: IPublication) {\r\n if (model?.journal && !this.allJournals()?.some((j) => j === model.journal)) {\r\n this.allJournals.push(model.journal);\r\n ko.tasks.runEarly();\r\n }\r\n\r\n if (model) {\r\n this.id = model.id;\r\n this.title(model.title);\r\n this.year(model.year);\r\n this.type(model.type);\r\n this.authors(model.authors);\r\n this.journal(model.journal);\r\n this.cite(model.cite);\r\n this.doi(model.doi);\r\n this.description(model.description);\r\n this.mainScienceDriver(model.scienceDriverIds[0]);\r\n this.otherScienceDrivers(model.scienceDriverIds.slice(1));\r\n this.materialIds(model.materials.map((m) => m.id));\r\n this.synthesisInstruments = model.synthesisInstruments ?? [];\r\n this.characterizationInstruments = model.characterizationInstruments ?? [];\r\n this.synthesisInstrumentIds(this.synthesisInstruments.map((i) => i.id));\r\n this.characterizationInstrumentIds(this.characterizationInstruments.map((i) => i.id));\r\n this.projects(model.projects);\r\n this.selectedProjectIds(model.projects.map((p) => p.id));\r\n\r\n this.lastChangedByUser(model.lastChangedByUser);\r\n this.lastChangedDate(deserializeDateTime(model.lastChangedDate));\r\n }\r\n this.status(model?.id ? Status.Submitted : Status.New);\r\n this._isNew(!model?.id);\r\n\r\n return Promise.resolve();\r\n }\r\n\r\n protected setChangeTrigger(): void {\r\n this.title.subscribe(this._modified(\"title\"));\r\n this.year.subscribe(this._modified(\"year\"));\r\n this.type.subscribe(this._modified(\"type\"));\r\n this.authors.subscribe(this._modified(\"authors\"));\r\n this.journal.subscribe(this._modified(\"journal\"));\r\n this.cite.subscribe(this._modified(\"cite\"));\r\n this.description.subscribe(this._modified(\"description\"));\r\n this.materialIds.subscribe(this._modified(\"materialIds\"));\r\n this.synthesisInstrumentIds.subscribe(this._modified(\"synthesisInstrumentIds\"));\r\n this.characterizationInstrumentIds.subscribe(this._modified(\"characterizationInstrumentIds\"));\r\n this.doi.subscribe(this._modified(\"doi\"));\r\n this.mainScienceDriver.subscribe(this._modified(\"mainScienceDriver\"));\r\n this.otherScienceDrivers.subscribe(this._modified(\"otherScienceDrivers\"));\r\n this.selectedProjectIds.subscribe(this._modified(\"projectIds\"));\r\n }\r\n\r\n private _modified(field: string): (newValue: any) => void {\r\n return (newValue: any) => {\r\n this._isDirty(true);\r\n if (this._owner) {\r\n this._owner.modified(field)(newValue);\r\n }\r\n };\r\n }\r\n\r\n private _configureValidation(): Record {\r\n return {\r\n abstract: this.description.extend({\r\n displayName: \"Abstract\",\r\n required: false,\r\n }),\r\n authors: this.authors.extend({\r\n displayName: \"Authors\",\r\n required: true,\r\n }),\r\n cite: this.cite.extend({\r\n displayName: \"Cite\",\r\n required: true,\r\n }),\r\n doi: this.doi.extend({\r\n displayName: \"DOI\",\r\n required: true,\r\n }),\r\n mainScienceDriver: this.mainScienceDriver.extend({\r\n displayName: \"Science Driver\",\r\n required: true,\r\n }),\r\n journal: this.journal.extend({\r\n displayName: \"Journal\",\r\n required: true,\r\n }),\r\n title: this.title.extend({\r\n displayName: \"Title\",\r\n required: true,\r\n }),\r\n year: this.year.extend({\r\n displayName: \"Year\",\r\n max: 2199,\r\n min: 2000,\r\n number: true,\r\n required: true,\r\n }),\r\n type: this.type.extend({\r\n displayName: \"Type\",\r\n required: true,\r\n }),\r\n };\r\n }\r\n\r\n private async _save(): Promise {\r\n if (this.submitValidation.isValid()) {\r\n try {\r\n this.mainView.showWorkingMask(true);\r\n const saved = this._isNew() ? await this._repo.create(this.getModel()) : await this._repo.update(this.getModel());\r\n saved.isNew = this._isNew();\r\n\r\n this._isNew(false);\r\n this._isDirty(false);\r\n if (this._onSave) {\r\n this._onSave(saved);\r\n }\r\n this.mainView.showWorkingMask(false);\r\n return saved;\r\n } catch (error) {\r\n this.mainView.showWorkingMask(false);\r\n this.mainView.showError(new ApplicationError(error, \"Save Data\", \"Data could not be saved\"));\r\n }\r\n } else {\r\n this.submitValidation.errors.showAllMessages();\r\n // this.mainView\r\n // .openErrorPopup(ValidationPopup.createPopup(\"Please correct the following issues\", this.submitValidation))\r\n // .catch((e) => log.trace(e));\r\n }\r\n return undefined;\r\n }\r\n}\r\n","import ko, { Observable } from \"knockout\";\r\nimport \"knockout.validation\";\r\n\r\nimport IMainView from \"app/viewModel/base/IMainView\";\r\nimport IUserManager from \"app/services/user/UserManager\";\r\nimport IMasterData from \"../../dataRegistry/IMasterData\";\r\n\r\nexport default class BaseViewModel {\r\n\r\n /**\r\n * We use two validation objects here.\r\n *\r\n * This validation has to pass before even creating anything in the database.\r\n * It is used to make sure we have everything needed for ID generation, box folder names, etc.\r\n */\r\n public initialValidation: ko.validation.ObservableGroup = ko.validatedObservable({});\r\n\r\n /**\r\n * The main validation happens on submit. We need all required attributes then,\r\n * they cannot be changed later.\r\n */\r\n public submitValidation: ko.validation.ObservableGroup = ko.validatedObservable({});\r\n\r\n private _mainView: IMainView;\r\n public set mainView(mainView: IMainView) { this._mainView = mainView; }\r\n public get mainView() { return this._mainView; }\r\n\r\n private _user: IUserManager;\r\n public set user(user: IUserManager) {\r\n this._user = user;\r\n }\r\n public get user() {\r\n return this._user;\r\n }\r\n\r\n private _masterData: IMasterData;\r\n public set masterData(masterData: IMasterData) {\r\n this._masterData = masterData;\r\n }\r\n public get masterData() {\r\n return this._masterData;\r\n }\r\n\r\n public async initViewModel() : Promise {\r\n this.initialValidation = ko.validatedObservable(this.configureInitialValidation());\r\n this.submitValidation = ko.validatedObservable(this.configureSubmitValidation());\r\n return Promise.resolve();\r\n }\r\n\r\n protected configureSubmitValidation(): Record | Array> {\r\n return {};\r\n }\r\n\r\n protected configureInitialValidation(): Record | Array> {\r\n return {};\r\n }\r\n\r\n\r\n protected canBeSubmitted(): boolean {\r\n if (this.submitValidation && !this.submitValidation.isValid()) {\r\n this.submitValidation.errors.showAllMessages();\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n protected canBeSaved(): boolean {\r\n if (this.initialValidation && !this.initialValidation.isValid()) {\r\n this.initialValidation.errors.showAllMessages();\r\n return false;\r\n }\r\n return true;\r\n }\r\n\r\n}\r\n","import ko, { Observable, PureComputed } from \"knockout\";\r\nimport log from \"loglevel\";\r\n\r\nimport { Status } from \"app/model/Constants\";\r\n\r\nimport BaseViewModel from \"./BaseViewModel\";\r\nimport { Privilege, Operation } from \"app/auth/AuthConstants\";\r\nimport IModificationTracker from \"./ModificationTracker\";\r\nimport IMainView from \"./IMainView\";\r\nimport { DateFormat, formatDate } from \"app/helper/DateHelper\";\r\n\r\nexport default interface IDataObject extends IModificationTracker {\r\n /**\r\n * Check if data object is readonly.\r\n * This is set according to user rights, and depends if it is a snapshot or not.\r\n *\r\n * For community users, everything is readonly.\r\n */\r\n readonly: (val?: boolean) => boolean;\r\n\r\n isUploading(): boolean;\r\n\r\n /**\r\n * Pending objects can still be modified by all users having sufficient privileges.\r\n */\r\n isPending(): boolean;\r\n\r\n /**\r\n * Check if this object is new in the client and has not yet been saved to the server.\r\n * In that case no requests fo sub objects etc. should be send to the server.\r\n */\r\n isNew(): boolean;\r\n /**\r\n * Submitted objects are immutable. It requires admin permissions to reset them to pending.\r\n */\r\n isSubmitted(): boolean;\r\n}\r\n\r\nexport class DataObject extends BaseViewModel implements IDataObject {\r\n public lastChangedDate: Observable = ko.observable(null);\r\n public lastChangedDateText: () => string = ko.pureComputed(() =>\r\n this.lastChangedDate() ? formatDate(this.lastChangedDate(), DateFormat.dateTime) : \"Now\"\r\n );\r\n public lastChangedByUser: Observable = ko.observable();\r\n public status: Observable = ko.observable(Status.New as Status);\r\n\r\n public hasModifications: Observable = ko.observable(false as boolean);\r\n public isUploading: Observable = ko.observable(false as boolean);\r\n public isLoading: Observable = ko.observable(false as boolean);\r\n\r\n /**\r\n * Readonly is used on all fields of that object, and changes those into display only mode\r\n */\r\n public readonly: (val?: boolean) => boolean = ko.observable(false as boolean);\r\n /**\r\n * Indicates if any update can be done - this could be possible even though the object itself is readonly,\r\n * if there are associated data like notes that can be added/modified\r\n */\r\n public canUpdate: PureComputed;\r\n public canReset: PureComputed;\r\n public canSubmit: PureComputed;\r\n public canDelete: PureComputed;\r\n\r\n public isNew: PureComputed;\r\n public isPending: PureComputed;\r\n public isSubmitted: PureComputed;\r\n public isPublished: () => boolean;\r\n\r\n // Those are populated with user privileges by this.requirePrivilege.\r\n protected userCanReset: Observable = ko.observable(false as boolean);\r\n protected userCanSubmit: Observable = ko.observable(false as boolean);\r\n protected userCanDelete: Observable = ko.observable(false as boolean);\r\n protected userCanUpdate: Observable = ko.observable(false as boolean);\r\n\r\n constructor() {\r\n super();\r\n this.lastChangedByUser(\"\");\r\n\r\n // Modification not yet submitted\r\n this.isPending = ko.pureComputed(() => this.status() === Status.Pending);\r\n\r\n this.isNew = ko.pureComputed(() => this.status() === Status.New);\r\n\r\n this.isPublished = ko.pureComputed(() => this.status() === Status.Published);\r\n\r\n this.isSubmitted = ko.pureComputed(() => this.status() === Status.Submitted);\r\n\r\n this.canUpdate = ko.pureComputed(\r\n () => this.userCanUpdate() && !this.isStatusReadonly(this.status())\r\n // this.status() !== Status.Published &&\r\n // (this.status() !== Status.Submitted ||\r\n // this.canUpdateAssociatedDataWhenSubmitted() ||\r\n // this.isStatusReadonly())\r\n );\r\n\r\n this.canDelete = ko.pureComputed(\r\n () =>\r\n !this.isPublished() &&\r\n !this.isUploading() &&\r\n !this.hasModifications() &&\r\n !this.isSubmitted() &&\r\n this.userCanDelete()\r\n );\r\n\r\n // It has to be pending in the first place. That \"not submitted\" doesn't work anymore,\r\n // now that some things might be published.\r\n this.canSubmit = ko.pureComputed(\r\n () => this.isPending() && !this.isUploading() && !this.hasModifications() && this.userCanSubmit()\r\n );\r\n\r\n this.canReset = ko.pureComputed(\r\n () =>\r\n !this.isPublished() && !this.isUploading() && !this.hasModifications() && this.isSubmitted() && this.userCanReset()\r\n );\r\n }\r\n\r\n public static setupModificationTracker(main: IMainView, privilege: Privilege) {\r\n const dataObject = new DataObject();\r\n dataObject.mainView = main;\r\n dataObject.requirePrivilege(privilege);\r\n return dataObject;\r\n }\r\n\r\n /**\r\n * One role or list of roles required to modify any content.\r\n */\r\n public requirePrivilege(privilege: Privilege): void {\r\n this.userCanDelete(this.mainView.isAuthorized(privilege, Operation.Delete));\r\n this.userCanSubmit(this.mainView.isAuthorized(privilege, Operation.Submit));\r\n this.userCanReset(this.mainView.isAuthorized(privilege, Operation.ResetToPending));\r\n this.userCanUpdate(this.mainView.isAuthorized(privilege, Operation.Update));\r\n\r\n this.readonly(!this.userCanUpdate() || this.isStatusReadonly(this.status()));\r\n }\r\n\r\n public modified(field: string, handler?: () => void): (newValue: any) => void {\r\n return () => {\r\n if (this.canUpdate()) {\r\n this.hasModifications(true);\r\n if (handler) {\r\n handler();\r\n }\r\n }\r\n };\r\n }\r\n\r\n /**\r\n * Initializes this view model with a model (loaded from server).\r\n * Sets all fields according to this model, resets validation errors\r\n * and marks this object as unmodified.\r\n *\r\n */\r\n public async initWithModel(model: any): Promise {\r\n try {\r\n await this.setModelData(model);\r\n ko.tasks.runEarly();\r\n await new Promise((resolve) => setTimeout(resolve, 1));\r\n\r\n // setting model data\r\n // may trigger functions listening to changes (like modification detection).\r\n // Let this happen now, so we can set the object unmodified\r\n // AFTER all this trigger runs. We do not want the entering of model data\r\n // setting an object to modified ...\r\n\r\n this.hasModifications(!model);\r\n this.setChangeTrigger();\r\n if (this.submitValidation.errors) {\r\n this.submitValidation.errors.showAllMessages(false);\r\n }\r\n } catch (error) {\r\n log.trace(error);\r\n this.mainView.showError(error);\r\n }\r\n }\r\n\r\n public getId(): number {\r\n return -1;\r\n }\r\n\r\n public getObjectTypeAndLabel(): string {\r\n return `${this.constructor.name} ${this.getId()}`;\r\n }\r\n\r\n public async loadSubObjects(): Promise {\r\n // nothing to do here, cannot be abstract because of typescript's mixin mechanism\r\n }\r\n\r\n public async loadCompletely(): Promise {\r\n // nothing to do here, cannot be abstract because of typescript's mixin mechanism\r\n }\r\n\r\n /**\r\n * Can be overwritten to prevent automatic saving of new data,\r\n * e.g. when IDs are generated and shall be validated by the user before saving.\r\n *\r\n * Modifications to existing data are always saved automatically.\r\n */\r\n public autosaveNewObject() {\r\n return true;\r\n }\r\n\r\n /**\r\n * If a certain status allows updating. Normally, Published and Submitted are readonly.\r\n *\r\n * @param status\r\n * @returns\r\n */\r\n protected isStatusReadonly(status: Status): boolean {\r\n return status === Status.Published || status === Status.Submitted;\r\n }\r\n\r\n protected canUpdateAssociatedDataWhenSubmitted() {\r\n return false;\r\n }\r\n\r\n protected async setModelData(model: unknown): Promise {\r\n return Promise.resolve();\r\n // nothing to do here, cannot be abstract because of typescript's mixin mechanism\r\n }\r\n\r\n protected getModel(): any {\r\n // nothing to do here, cannot be abstract because of typescript's mixin mechanism\r\n }\r\n\r\n protected setChangeTrigger(): void {\r\n // nothing to do here, cannot be abstract because of typescript's mixin mechanism\r\n }\r\n\r\n protected async saveAssociatedData(): Promise {\r\n // nothing to do here, cannot be abstract because of typescript's mixin mechanism\r\n return Promise.resolve(true);\r\n }\r\n\r\n protected getUploadingStatusText = () => \"File are being uploaded...\";\r\n}\r\n","import ko, { Observable } from \"knockout\";\r\n\r\nimport IPopup from \"./IPopup\";\r\n\r\nexport default class InfoPopup implements IPopup {\r\n\r\n public get templateName() { return \"InfoPopup\"; }\r\n\r\n public action: Observable = ko.observable();\r\n public message: Observable = ko.observable();\r\n\r\n private _onClose: () => void;\r\n\r\n public constructor(message: string, action: string) {\r\n this.action(action);\r\n this.message(message);\r\n }\r\n\r\n public async showInPopup(): Promise {\r\n return new Promise((resolve) => {\r\n this._onClose = resolve;\r\n });\r\n }\r\n\r\n public close(): Promise {\r\n if (this._onClose) {\r\n this._onClose();\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n public confirm(): Promise {\r\n return this.close();\r\n }\r\n\r\n}\r\n","import ko, { Observable, PureComputed } from \"knockout\";\r\nimport log from \"loglevel\";\r\n\r\nimport ApplicationError from \"app/model/error/ApplicationError\";\r\nimport RemoteError from \"app/services/remote/RemoteError\";\r\nimport ErrorPopup from \"app/viewModel/popup/ErrorPopup\";\r\nimport InfoPopup from \"app/viewModel/popup/InfoPopup\";\r\nimport IPopup from \"app/viewModel/popup/IPopup\";\r\nimport QuestionPopup from \"app/viewModel/popup/QuestionPopup\";\r\nimport IMainView from \"./IMainView\";\r\nimport { Privilege, Operation } from \"app/auth/AuthConstants\";\r\nimport { UserManager } from \"app/services/user/UserManager\";\r\nimport IUserPrivilege from \"app/model/masterdata/UserPrivilege\";\r\nimport IRemoteServer from \"app/services/remote/IRemoteServer\";\r\n\r\nexport default abstract class MainView implements IMainView {\r\n /**\r\n * * Bound to View via knockout data-binding\r\n */\r\n public showPopup: Observable = ko.observable();\r\n /**\r\n * * Bound to View via knockout data-binding\r\n */\r\n public currentPopup: Observable> = ko.observable();\r\n /**\r\n * * Bound to View via knockout data-binding\r\n */\r\n public popupTemplate: PureComputed = ko.pureComputed(\r\n () => this.currentPopup() ? this.currentPopup().templateName : \"empty\"\r\n );\r\n\r\n /**\r\n * * Bound to View via knockout data-binding\r\n */\r\n public errorPopupTemplate: PureComputed = ko.pureComputed(\r\n () => this.currentErrorPopup() ? this.currentErrorPopup().templateName : \"empty\"\r\n );\r\n\r\n /**\r\n * * Bound to View via knockout data-binding\r\n */\r\n public showErrorPopup: Observable = ko.observable();\r\n\r\n /**\r\n * * Bound to View via knockout data-binding\r\n */\r\n public currentErrorPopup: Observable> = ko.observable();\r\n\r\n\r\n /**\r\n * * Bound to View via knockout data-binding\r\n */\r\n public initialized: Observable = ko.observable(false as boolean);\r\n /**\r\n * * Bound to View via knockout data-binding\r\n */\r\n public showWorkingMask: Observable = ko.observable(true as boolean);\r\n\r\n private _privileges: IUserPrivilege[];\r\n public get privileges() { return this._privileges; }\r\n public set privileges(privileges: IUserPrivilege[]) { this._privileges = privileges; }\r\n\r\n private _remote: IRemoteServer;\r\n\r\n public constructor(remote: IRemoteServer) {\r\n this._remote = remote;\r\n }\r\n\r\n public async askUserIfContinue(action: string, question: string, explanation?: string): Promise {\r\n return this.openErrorPopup(new QuestionPopup(action, question, explanation));\r\n }\r\n\r\n public async openPopup(popup: IPopup): Promise {\r\n const formerActivePopup = this.showPopup() ? this.currentPopup() : undefined;\r\n this.currentPopup(popup);\r\n this.showPopup(true);\r\n const result: TReturn = await popup.showInPopup();\r\n if (formerActivePopup) {\r\n this.currentPopup(formerActivePopup);\r\n this.showPopup(true);\r\n } else {\r\n this.currentPopup(undefined);\r\n this.showPopup(false);\r\n }\r\n return result;\r\n }\r\n\r\n public async openErrorPopup(popup: IPopup): Promise {\r\n this.currentErrorPopup(popup);\r\n this.showErrorPopup(true);\r\n const result: TReturn = await popup.showInPopup();\r\n this.currentErrorPopup(undefined);\r\n this.showErrorPopup(false);\r\n if (!this.initialized()) {\r\n window.location.href = this._remote.getBaseAppUrl();\r\n }\r\n return result;\r\n }\r\n\r\n /**\r\n * Remove the loading mask and display whatever data has been loaded initially\r\n */\r\n public setInitialized(): void {\r\n this.initialized(true);\r\n this.showWorkingMask(false);\r\n }\r\n\r\n public isAuthorized(privilege: Privilege, op: Operation = Operation.Read): boolean {\r\n return UserManager.isAuthorized(this._privileges, privilege, op);\r\n }\r\n\r\n public showInfo(message: string, action: string): void {\r\n const popup = new InfoPopup(message, action);\r\n this.openErrorPopup(popup)\r\n .catch((e) => log.trace(e));\r\n }\r\n\r\n public showError(error: RemoteError | ApplicationError): void {\r\n const popup = new ErrorPopup(\r\n error instanceof ApplicationError ? error : new ApplicationError(error)\r\n );\r\n this.openErrorPopup(popup)\r\n .catch((e) => log.trace(e));\r\n\r\n }\r\n\r\n public async executeCheckedOperation(\r\n operation: () => Promise, withWorkingMask = true\r\n ): Promise {\r\n try {\r\n if (withWorkingMask) {\r\n this.showWorkingMask(true);\r\n }\r\n await operation();\r\n } catch (error) {\r\n this.showError(error);\r\n } finally {\r\n this.showWorkingMask(false);\r\n }\r\n }\r\n\r\n public abstract isDirty(): boolean;\r\n}\r\n","import ko, { PureComputed, Observable } from \"knockout\";\r\n\r\nexport default interface ITab {\r\n title: string;\r\n isSelected: () => boolean;\r\n visible: () => boolean;\r\n templateName: string;\r\n currentSelectedTab: () => ITab;\r\n}\r\n\r\nexport abstract class Tab implements ITab {\r\n public abstract templateName: string;\r\n\r\n public isSelected: PureComputed;\r\n public visible: Observable = ko.observable(true as boolean);\r\n\r\n private _title: string;\r\n public get title() { return this._title; }\r\n public set title(title: string) { this._title = title; }\r\n\r\n\r\n private _currentSelectedTab: () => ITab;\r\n public set currentSelectedTab(selected: () => ITab) { this._currentSelectedTab = selected; }\r\n\r\n\r\n protected constructor() {\r\n this.isSelected = ko.pureComputed(() => this === this._currentSelectedTab(), this);\r\n }\r\n}\r\n","import ko, { ObservableArray, Observable } from \"knockout\";\r\n\r\nimport IMaterial, { Material } from \"app/model/masterdata/Material\";\r\nimport IMaterialRepository from \"app/repository/MaterialRepository\";\r\n\r\nimport IMainView from \"app/viewModel/base/IMainView\";\r\nimport ElementsMap from \"app/viewModel/materialSearch/ElementMap\";\r\nimport IPopup from \"../../popup/IPopup\";\r\nimport ValidationPopup from \"../../popup/ValidationPopup\";\r\nimport IMaterialsRegistry from \"app/dataRegistry/IMaterialsRegistry\";\r\n\r\nexport default class MaterialPopup implements IPopup {\r\n public id: Observable = ko.observable();\r\n public name: Observable = ko.observable();\r\n public label: Observable = ko.observable();\r\n public isSubstrate: Observable = ko.observable(false as boolean);\r\n\r\n public form?: Observable = ko.observable();\r\n public externalId?: Observable = ko.observable();\r\n\r\n public get templateName() {\r\n return \"components/MaterialPopup\";\r\n }\r\n public submitValidation: ko.validation.ObservableGroup = ko.validatedObservable({});\r\n\r\n public readonly: Observable = ko.observable(false as boolean);\r\n\r\n private _repo: IMaterialRepository;\r\n private _callback: (material: Material) => void;\r\n\r\n private _masterData: IMaterialsRegistry;\r\n private _materialList: ObservableArray;\r\n private _mainView: IMainView;\r\n\r\n public constructor(repo: IMaterialRepository, mainView: IMainView, materialProvider: IMaterialsRegistry | ObservableArray) {\r\n this._repo = repo;\r\n this._mainView = mainView;\r\n if (ko.isObservableArray(materialProvider)) {\r\n this._materialList = materialProvider as ObservableArray;\r\n } else if (materialProvider && (materialProvider as IMaterialsRegistry).materials) {\r\n this._masterData = materialProvider as IMaterialsRegistry;\r\n } else {\r\n throw new Error(`Incorrect setup, materialProvider is something unexpected ${typeof materialProvider}`);\r\n }\r\n\r\n const labelGenerator = () => {\r\n const m = Material.updateComponents(this.name());\r\n this.label(m.label + (this.form() ? ` (${this.form()})` : \"\"));\r\n };\r\n this.name.subscribe(labelGenerator);\r\n this.form.subscribe(labelGenerator);\r\n this._initValidation();\r\n }\r\n\r\n public getModel(): IMaterial {\r\n return {\r\n aliases: [],\r\n externalId: this.externalId(),\r\n form: this.form(),\r\n id: this.id(),\r\n isSubstrate: this.isSubstrate(),\r\n label: this.label(),\r\n name: this.name(),\r\n };\r\n }\r\n\r\n public async showInPopup(): Promise {\r\n return new Promise((resolve) => {\r\n this._callback = resolve;\r\n });\r\n }\r\n\r\n public close(): Promise {\r\n if (this._callback) {\r\n this._callback(undefined);\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n public async confirm(): Promise {\r\n if (this.submitValidation.isValid()) {\r\n try {\r\n const newMaterial = await this._doCreate();\r\n this._addNewMaterial(newMaterial);\r\n if (this._callback) {\r\n // We just changed the observable array of materials\r\n // If someone is listening, a select field might be updated\r\n // This should only be done AFTER knockout had a chance to actually do these updates.\r\n // Otherwise, the new Material might not yet be in the options list ...\r\n ko.tasks.runEarly();\r\n setTimeout(() => {\r\n this._callback(newMaterial);\r\n }, 0);\r\n }\r\n } catch (error) {\r\n this._mainView.showError(error);\r\n }\r\n } else {\r\n this.submitValidation.errors.showAllMessages();\r\n return this._mainView.openErrorPopup(ValidationPopup.createPopup(\"Please correct the following issues\", this.submitValidation));\r\n }\r\n }\r\n\r\n public getId() {\r\n return this.id();\r\n }\r\n\r\n public setModelData(model: IMaterial) {\r\n if (model) {\r\n this.id(model.id);\r\n this.label(model.label);\r\n this.name(model.name);\r\n this.form(model.form);\r\n this.externalId(model.externalId);\r\n\r\n this.readonly(true);\r\n }\r\n }\r\n\r\n private async _doCreate(): Promise {\r\n const model = this.getModel();\r\n const saved = await this._repo.create(model);\r\n this.id(saved.id);\r\n return saved;\r\n }\r\n\r\n private _addNewMaterial(newMaterial: Material) {\r\n if (this._masterData) {\r\n if (this._masterData.materials().findIndex((m) => m.name === newMaterial.name) === -1) {\r\n this._masterData.addMaterial(newMaterial);\r\n }\r\n } else {\r\n this._materialList.push(newMaterial);\r\n }\r\n }\r\n private _existsMaterial(val: string) {\r\n if (this._masterData) {\r\n return this._masterData.materials().some((m) => m.name === val);\r\n } else {\r\n return this._materialList().some((m) => m.name === val);\r\n }\r\n }\r\n\r\n private _initValidation() {\r\n this.submitValidation = ko.validatedObservable({\r\n name: this.name.extend({\r\n displayName: \"Name\",\r\n validation: [\r\n {\r\n message: \"This field is required\",\r\n validator: (val: string) => {\r\n return !!val;\r\n },\r\n },\r\n {\r\n message: \"This material already exists\",\r\n validator: (val: string) => {\r\n return !this._existsMaterial(val);\r\n },\r\n },\r\n {\r\n message: \"Materials must be compositions of elements\",\r\n validator: (val: string) => {\r\n const m = Material.updateComponents(val);\r\n const elems = new ElementsMap();\r\n for (const comp of m.components) {\r\n if (elems.getArray().findIndex((e) => e.name === comp) === -1) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n },\r\n },\r\n ],\r\n }),\r\n });\r\n }\r\n}\r\n","import ko, { Observable } from \"knockout\";\r\n\r\nexport default class Element {\r\n public name: string;\r\n public clicked: Observable;\r\n public disabled: Observable;\r\n public left: string;\r\n public top: string;\r\n\r\n constructor(name: string, row: number, column: number) {\r\n this.name = name;\r\n this.clicked = ko.observable(false as boolean);\r\n this.disabled = ko.observable(true as boolean);\r\n\r\n this.left = `${(column - 1) * 30}px`;\r\n\r\n this.top = `${((row - 1) * 30 + 5) + (row > 6 ? 5 : 0)}px`;\r\n }\r\n\r\n public isDisabled() {\r\n return this.disabled();\r\n }\r\n\r\n}\r\n","import Element from \"app/viewModel/materialSearch/Element\";\r\nimport MaterialMap from \"app/viewModel/materialSearch/MaterialMap\";\r\n\r\n\r\nexport default class ElementsMap {\r\n\r\n private readonly _array: Element[];\r\n private readonly _table: Map;\r\n\r\n constructor() {\r\n this._array = [\r\n // First\r\n new Element(\"H\", 1, 1),\r\n new Element(\"He\", 1, 18),\r\n // Second\r\n new Element(\"Li\", 2, 1),\r\n new Element(\"Be\", 2, 2),\r\n new Element(\"B\", 2, 13),\r\n new Element(\"C\", 2, 14),\r\n new Element(\"N\", 2, 15),\r\n new Element(\"O\", 2, 16),\r\n new Element(\"F\", 2, 17),\r\n new Element(\"Ne\", 2, 18),\r\n // Third\r\n new Element(\"Na\", 3, 1),\r\n new Element(\"Mg\", 3, 2),\r\n new Element(\"Al\", 3, 13),\r\n new Element(\"Si\", 3, 14),\r\n new Element(\"P\", 3, 15),\r\n new Element(\"S\", 3, 16),\r\n new Element(\"Cl\", 3, 17),\r\n new Element(\"Ar\", 3, 18),\r\n // Fourth\r\n new Element(\"K\", 4, 1),\r\n new Element(\"Ca\", 4, 2),\r\n new Element(\"Sc\", 4, 3),\r\n new Element(\"Ti\", 4, 4),\r\n new Element(\"V\", 4, 5),\r\n new Element(\"Cr\", 4, 6),\r\n new Element(\"Mn\", 4, 7),\r\n new Element(\"Fe\", 4, 8),\r\n new Element(\"Co\", 4, 9),\r\n new Element(\"Ni\", 4, 10),\r\n new Element(\"Cu\", 4, 11),\r\n new Element(\"Zn\", 4, 12),\r\n new Element(\"Ga\", 4, 13),\r\n new Element(\"Ge\", 4, 14),\r\n new Element(\"As\", 4, 15),\r\n new Element(\"Se\", 4, 16),\r\n new Element(\"Br\", 4, 17),\r\n new Element(\"Kr\", 4, 18),\r\n // Fifth\r\n new Element(\"Rb\", 5, 1),\r\n new Element(\"Sr\", 5, 2),\r\n new Element(\"Y\", 5, 3),\r\n new Element(\"Zr\", 5, 4),\r\n new Element(\"Nb\", 5, 5),\r\n new Element(\"Mo\", 5, 6),\r\n new Element(\"Tc\", 5, 7),\r\n new Element(\"Ru\", 5, 8),\r\n new Element(\"Rh\", 5, 9),\r\n new Element(\"Pd\", 5, 10),\r\n new Element(\"Ag\", 5, 11),\r\n new Element(\"Cd\", 5, 12),\r\n new Element(\"In\", 5, 13),\r\n new Element(\"Sn\", 5, 14),\r\n new Element(\"Sb\", 5, 15),\r\n new Element(\"Te\", 5, 16),\r\n new Element(\"I\", 5, 17),\r\n new Element(\"Xe\", 5, 18),\r\n // Sixth\r\n new Element(\"Cs\", 6, 1),\r\n new Element(\"Ba\", 6, 2),\r\n new Element(\"Hf\", 6, 4),\r\n new Element(\"Ta\", 6, 5),\r\n new Element(\"W\", 6, 6),\r\n new Element(\"Re\", 6, 7),\r\n new Element(\"Os\", 6, 8),\r\n new Element(\"Ir\", 6, 9),\r\n new Element(\"Pt\", 6, 10),\r\n new Element(\"Au\", 6, 11),\r\n new Element(\"Hg\", 6, 12),\r\n new Element(\"Tl\", 6, 13),\r\n new Element(\"Pb\", 6, 14),\r\n new Element(\"Bi\", 6, 15),\r\n new Element(\"Po\", 6, 16),\r\n new Element(\"At\", 6, 17),\r\n new Element(\"Rn\", 6, 18),\r\n // La\r\n new Element(\"La\", 7, 3),\r\n new Element(\"Ce\", 7, 4),\r\n new Element(\"Pr\", 7, 5),\r\n new Element(\"Nd\", 7, 6),\r\n new Element(\"Pm\", 7, 7),\r\n new Element(\"Sm\", 7, 8),\r\n new Element(\"Eu\", 7, 9),\r\n new Element(\"Gd\", 7, 10),\r\n new Element(\"Tb\", 7, 11),\r\n new Element(\"Dy\", 7, 12),\r\n new Element(\"Ho\", 7, 13),\r\n new Element(\"Er\", 7, 14),\r\n new Element(\"Tm\", 7, 15),\r\n new Element(\"Yb\", 7, 16),\r\n new Element(\"Lu\", 7, 17),\r\n // Ac\r\n new Element(\"Ac\", 8, 3),\r\n new Element(\"Th\", 8, 4),\r\n new Element(\"Pa\", 8, 5),\r\n new Element(\"U\", 8, 6),\r\n new Element(\"Np\", 8, 7),\r\n new Element(\"Pu\", 8, 8),\r\n new Element(\"Am\", 8, 9),\r\n new Element(\"Cm\", 8, 10),\r\n new Element(\"Bk\", 8, 11),\r\n new Element(\"Cf\", 8, 12),\r\n new Element(\"Es\", 8, 13),\r\n new Element(\"Fm\", 8, 14),\r\n new Element(\"Md\", 8, 15),\r\n new Element(\"No\", 8, 16),\r\n new Element(\"Lr\", 8, 17),\r\n ];\r\n\r\n this._table = new Map();\r\n for (const elem of this._array) {\r\n this._table.set(elem.name, elem);\r\n }\r\n\r\n }\r\n\r\n public filterByMaterials(materials: MaterialMap) {\r\n for (const elem of this._array) {\r\n elem.disabled(true);\r\n }\r\n for (const material of materials.getArray()) {\r\n if (material.hidden()) {\r\n continue;\r\n }\r\n for (const component of material.components) {\r\n if (this._table.get(component) !== undefined) {\r\n this._table.get(component).disabled(false);\r\n }\r\n }\r\n }\r\n }\r\n\r\n public getArray(): Element[] {\r\n return this._array;\r\n }\r\n}\r\n","import IMaterial, { Material } from \"app/model/masterdata/Material\";\r\nimport ko, { Observable } from \"knockout\";\r\n\r\nexport default class MaterialFilterVM implements IMaterial {\r\n public id: number;\r\n public externalId: string;\r\n public name: string;\r\n public label: string;\r\n public components: string[];\r\n public active: Observable;\r\n public hidden: Observable;\r\n public aliases: MaterialFilterVM[];\r\n\r\n constructor(material: Material) {\r\n this.id = material.id;\r\n this.name = material.name;\r\n this.externalId = material.externalId;\r\n this.aliases = material.aliases ? material.aliases.map((m) => new MaterialFilterVM(m)) : [];\r\n this.active = ko.observable(false as boolean);\r\n this.hidden = ko.observable(false as boolean);\r\n\r\n this.label = material.label;\r\n this.components = material.components;\r\n }\r\n\r\n public filterMaterial() {\r\n this.active(!this.active());\r\n }\r\n\r\n public get link() {\r\n return this.externalId ? `https://materialsweb.org/twodmaterials/result/${this.externalId}` : undefined;\r\n }\r\n\r\n\r\n\r\n}\r\n","import { ReferencedMaterials } from \"app/model/Constants\";\r\nimport IMaterial, { Material } from \"app/model/masterdata/Material\";\r\nimport IMaterialRepository from \"app/repository/MaterialRepository\";\r\nimport Element from \"app/viewModel/materialSearch/Element\";\r\nimport MaterialFilterVM from \"app/viewModel/materialSearch/MaterialFilterVM\";\r\n\r\nexport default class MaterialMap {\r\n private _table: Map;\r\n private _array: MaterialFilterVM[];\r\n private readonly _repo: IMaterialRepository;\r\n\r\n constructor(repo: IMaterialRepository) {\r\n this._table = new Map();\r\n this._array = [];\r\n this._repo = repo;\r\n }\r\n\r\n public async loadAsync(ref: ReferencedMaterials) {\r\n this._table.clear();\r\n this._array = [];\r\n const loaded = await this._repo.loadAll(ref);\r\n\r\n const materials = [].concat(loaded, ...loaded.map((l) => l.aliases)) as Material[];\r\n materials.sort((a: IMaterial, b: IMaterial) => a.name.localeCompare(b.name));\r\n materials.forEach((m) => {\r\n const materialVM = new MaterialFilterVM(m);\r\n this._table.set(materialVM.name, materialVM);\r\n this._array.push(materialVM);\r\n });\r\n // make the alias ref list bidirectional. It is not when loaded from the database ...\r\n this._array.filter((m) => m.aliases.length)\r\n .forEach((m) => {\r\n m.aliases.forEach((alias) => {\r\n this._array.find((a) => a.id === alias.id).aliases.push(m);\r\n });\r\n });\r\n\r\n }\r\n\r\n public lookup(key: string): MaterialFilterVM {\r\n return this._table.get(key);\r\n }\r\n\r\n public getArray(): MaterialFilterVM[] {\r\n return this._array;\r\n }\r\n\r\n /*\r\n Filter List of Materials:\r\n Set all materials to hide that do not contain all currently selcted elements.\r\n */\r\n public filterByElement(elements: Element[]) {\r\n for (const material of this._array) {\r\n material.hidden(false);\r\n\r\n for (const elem of elements) {\r\n if (!material.components.includes(elem.name)) {\r\n material.hidden(true);\r\n // Deselect hidden materials: Would be confusing to apply an invisible filter\r\n material.active(false);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n","import { ReferencedMaterials } from \"app/model/Constants\";\r\nimport IMaterial from \"app/model/masterdata/Material\";\r\nimport IPopup from \"app/viewModel/popup/IPopup\";\r\nimport ko, { ObservableArray, PureComputed } from \"knockout\";\r\nimport Element from \"./Element\";\r\nimport ElementsMap from \"./ElementMap\";\r\nimport MaterialFilterVM from \"./MaterialFilterVM\";\r\nimport MaterialMap from \"./MaterialMap\";\r\n\r\nexport default interface ISearchByMaterial extends IPopup<{ materials: IMaterial[]; elements: Element[], selection: string }> {\r\n\r\n onSelectionChanged: (activeMaterials: IMaterial[], activeElements: Element[]) => void;\r\n\r\n init(ref: ReferencedMaterials, activeIds?: number[]): Promise;\r\n\r\n getSelectedMaterials(): IMaterial[];\r\n\r\n getMaterial(id: string): MaterialFilterVM;\r\n}\r\n\r\nexport class SearchByMaterial implements ISearchByMaterial {\r\n public get templateName() { return \"components/MaterialFilterPopup\"; }\r\n\r\n public elementsVM: ElementsMap;\r\n public currentRow: unknown;\r\n public elements: ObservableArray;\r\n public materials: ObservableArray;\r\n public resetDisabled: PureComputed;\r\n public materialsVM: MaterialMap;\r\n\r\n private _onSelectionChanged: (activeMaterials: IMaterial[]) => void;\r\n private _onClose: (selected: { materials: IMaterial[]; elements: Element[], selection: string }) => void;\r\n\r\n public set onSelectionChanged(callback: (activeMaterials: IMaterial[]) => void) {\r\n this._onSelectionChanged = callback;\r\n }\r\n\r\n constructor(materialsVM: MaterialMap, elementsVM: ElementsMap) {\r\n this.materialsVM = materialsVM;\r\n this.elementsVM = elementsVM;\r\n this.currentRow = {};\r\n this.elements = ko.observableArray();\r\n this.materials = ko.observableArray();\r\n\r\n this.resetDisabled = ko.pureComputed(() =>\r\n this.elements().every((e) => !e.clicked()) &&\r\n this.materials().every((m) => !m.active())\r\n );\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n this.resetElementFilter = this.resetElementFilter.bind(this);\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n this.filterByElement = this.filterByElement.bind(this);\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n this.filterByMaterial = this.filterByMaterial.bind(this);\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n this._updateMaterialList = this._updateMaterialList.bind(this);\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\r\n this.close = this.close.bind(this);\r\n\r\n }\r\n\r\n public filterByElement(element: Element) {\r\n if (element.isDisabled()) {\r\n return;\r\n }\r\n element.clicked(!element.clicked());\r\n this._updateMaterialList();\r\n }\r\n\r\n public resetElementFilter() {\r\n this.elements().forEach((element) => { element.clicked(false) });\r\n this.materials().forEach((material) => { material.active(false) });\r\n this._updateMaterialList();\r\n }\r\n\r\n public filterByMaterial(material: MaterialFilterVM) {\r\n material.active(!material.active());\r\n if (this._onSelectionChanged) {\r\n this._onSelectionChanged(this.getSelectedMaterials());\r\n }\r\n }\r\n\r\n public getMaterial(id: string): MaterialFilterVM {\r\n return this.materialsVM.lookup(id);\r\n }\r\n\r\n public async showInPopup(): Promise<{ materials: IMaterial[]; elements: Element[], selection: string }> {\r\n return new Promise<{ materials: IMaterial[]; elements: Element[], selection: string }>(\r\n (resolve) => {\r\n this._onClose = resolve;\r\n });\r\n }\r\n\r\n public async init(ref: ReferencedMaterials, activeIds: number[] = []): Promise {\r\n await this.materialsVM.loadAsync(ref);\r\n\r\n this.elements(this.elementsVM.getArray());\r\n this.materials(this.materialsVM.getArray());\r\n\r\n this.materials().forEach((material) => { material.hidden(false) });\r\n this.materials().forEach((e) => { e.active(activeIds.includes(e.id)) });\r\n\r\n this.elements().forEach((element) => {\r\n element.clicked(false);\r\n element.disabled(false);\r\n });\r\n this.elementsVM.filterByMaterials(this.materialsVM);\r\n }\r\n\r\n public getSelectedMaterials(): IMaterial[] {\r\n if (this.materials().some((m) => m.active())) {\r\n // Materials explicitly clicked\r\n const filtered = this.materials().filter((m) => m.active());\r\n return filtered.concat(\r\n ...filtered.map((m) => m.aliases));\r\n\r\n // When no element has been selected, check if\r\n // the list has been filtered by selecting some elements.\r\n // We do not need to return all existing materials,\r\n // en empty array is returned for \"no filter\" then.\r\n } else if (this.elements().some((m) => m.clicked())) {\r\n return this.materials().filter((m) => !m.hidden());\r\n\r\n } else {\r\n return [];\r\n }\r\n }\r\n\r\n public getSelectedElements(): Element[] {\r\n if (this.materials().some((m) => m.active())) {\r\n // Materials selected, do not return elements selected\r\n // since not all materials for those elements are in the result.\r\n return [];\r\n\r\n } else {\r\n return this.elements().filter((m) => m.clicked());\r\n }\r\n }\r\n\r\n public close() {\r\n if (this._onClose) {\r\n const elements = this.getSelectedElements();\r\n const materials = this.getSelectedMaterials();\r\n this._onClose({\r\n elements,\r\n materials,\r\n selection: this._getSelectionDesc(materials, elements),\r\n });\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n\r\n public confirm() {\r\n return this.close();\r\n }\r\n\r\n\r\n private _getSelectionDesc(materials: IMaterial[], elements: Element[]) {\r\n if (elements.length > 0) {\r\n return elements.map((m) => `${m.name}*`).join(\"\").substring(0, 100);\r\n } else if (materials.length > 0) {\r\n return materials.map((m) => m.label).join(\", \").substring(0, 100);\r\n } else {\r\n return \"\";\r\n }\r\n }\r\n\r\n /**\r\n * Hide materials that do not contain all selected elements\r\n */\r\n private _updateMaterialList() {\r\n this.materialsVM.filterByElement(this.elements().filter((e) => e.clicked()));\r\n // Make all elements inactive that cannot be combined with the selected elements\r\n // (i.e. that would find nothing)\r\n this.elementsVM.filterByMaterials(this.materialsVM);\r\n\r\n if (this._onSelectionChanged) {\r\n this._onSelectionChanged(this.getSelectedMaterials());\r\n }\r\n\r\n }\r\n\r\n}\r\n","import ko, { Observable } from \"knockout\";\r\n\r\nimport ApplicationError from \"app/model/error/ApplicationError\";\r\nimport IPopup from \"./IPopup\";\r\n\r\nexport const ERROR_POPUP_TEMPLATE = \"ErrorPopup\";\r\n\r\nexport default class ErrorPopup implements IPopup {\r\n\r\n public get templateName() { return ERROR_POPUP_TEMPLATE; }\r\n\r\n public action: Observable = ko.observable();\r\n public title: Observable = ko.observable();\r\n public message: Observable = ko.observable();\r\n\r\n private _onClose: () => void;\r\n\r\n public constructor(error: ApplicationError) {\r\n this.action(error.action);\r\n this.title(error.message);\r\n this.message(error.details);\r\n if (error.htmlInPopup) {\r\n const w = window.open(\r\n \"\",\r\n \"Internal Server Error\",\r\n \"toolbar=no,location=no,directories=no,status=no,menubar=no,scrollbars=yes,resizable=yes\");\r\n w.document.body.innerHTML = error.htmlInPopup;\r\n }\r\n }\r\n\r\n public async showInPopup(): Promise {\r\n return new Promise((resolve) => {\r\n this._onClose = resolve;\r\n });\r\n }\r\n\r\n public close(): Promise {\r\n if (this._onClose) {\r\n this._onClose();\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n\r\n public confirm(): Promise {\r\n return this.close();\r\n }\r\n\r\n}\r\n\r\n","import ko, { Observable } from \"knockout\";\r\n\r\nimport IPopup from \"./IPopup\";\r\n\r\nexport default class QuestionPopup implements IPopup {\r\n public get templateName() {\r\n return \"QuestionPopup\";\r\n }\r\n\r\n public explanation: Observable = ko.observable();\r\n public question: Observable = ko.observable();\r\n public action: Observable = ko.observable(\"LiST\");\r\n\r\n private _onClose: (response: boolean) => void;\r\n\r\n public constructor(action: string, question: string, explanation?: string) {\r\n this.action(action);\r\n this.question(question);\r\n this.explanation(explanation);\r\n }\r\n\r\n public async showInPopup(): Promise {\r\n return new Promise((resolve) => {\r\n this._onClose = resolve;\r\n });\r\n }\r\n\r\n public close(): Promise {\r\n if (this._onClose) {\r\n this._onClose(false);\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n public confirm(): Promise {\r\n if (this._onClose) {\r\n this._onClose(true);\r\n }\r\n return Promise.resolve();\r\n }\r\n}\r\n","import ko, { Observable, ObservableArray } from \"knockout\";\r\n\r\nimport IPopup from \"./IPopup\";\r\nimport IRole from \"app/model/masterdata/Role\";\r\nimport ICollaboratorRepository from \"app/repository/CollaboratorRepository\";\r\nimport IMainView from \"../base/IMainView\";\r\nimport ICollaborator from \"app/model/masterdata/Collaborator\";\r\n\r\nexport interface IUserWithRole {\r\n userId: string;\r\n roleId: number;\r\n}\r\n\r\nexport default class SignInAsPopup implements IPopup {\r\n\r\n public get templateName() { return \"SignInAsPopup\"; }\r\n\r\n public userId: Observable = ko.observable();\r\n public roleId: Observable = ko.observable();\r\n public roles: ObservableArray = ko.observableArray();\r\n public users: ObservableArray = ko.observableArray();\r\n\r\n\r\n private _onClose: (user: IUserWithRole) => void;\r\n private _userRepo: ICollaboratorRepository;\r\n private _errorHandler: IMainView;\r\n\r\n\r\n\r\n public constructor(errorHandler: IMainView, userRepo: ICollaboratorRepository) {\r\n this._errorHandler = errorHandler;\r\n this._userRepo = userRepo;\r\n this.userId.subscribe(userId => this._updateRoles(userId));\r\n }\r\n\r\n public async showInPopup(): Promise {\r\n const [users, staff] = await\r\n Promise.all([\r\n this._userRepo.getUsers(),\r\n this._userRepo.getStaff(false)\r\n ]);\r\n const all = new Set(users.concat(staff)).values();\r\n this.users(Array.from(all).sort((c1, c2) => c1.lastName.localeCompare(c2.lastName)));\r\n\r\n return new Promise((resolve) => {\r\n this._onClose = resolve;\r\n });\r\n }\r\n\r\n public close(): Promise {\r\n if (this._onClose) {\r\n this._onClose(null);\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n public confirm(): Promise {\r\n if (this._onClose) {\r\n this._onClose({\r\n userId: this.userId(),\r\n roleId: this.roleId()\r\n });\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n private _updateRoles(userId: string) {\r\n this._userRepo.get(userId)\r\n .then((user) => {\r\n this.roles(user?.roles);\r\n if (this.roles().length > 0) {\r\n this.roleId(this.roles()[0].id);\r\n }\r\n })\r\n .catch((error) => {\r\n this._errorHandler.showError(error);\r\n })\r\n }\r\n\r\n}\r\n","import IPopup from \"./IPopup\";\r\nimport ko, { Observable } from \"knockout\";\r\nimport { ValidationObservable } from \"../../../../types/knockout.validation\";\r\n\r\nexport default class ValidationPopup implements IPopup {\r\n\r\n public get templateName() { return \"ValidationPopup\"; }\r\n\r\n public title: string;\r\n public items: string[];\r\n\r\n private _onClose: () => void;\r\n\r\n private constructor(title: string) {\r\n this.title = title;\r\n this.items = [];\r\n }\r\n\r\n public static createPopup(title: string, obs: Observable) {\r\n const popup = new ValidationPopup(title);\r\n popup._checkComposed(obs());\r\n return popup;\r\n }\r\n\r\n public async showInPopup(): Promise {\r\n return new Promise((resolve) => {\r\n this._onClose = resolve;\r\n });\r\n }\r\n\r\n public close(): Promise {\r\n if (this._onClose) {\r\n this._onClose();\r\n }\r\n return Promise.resolve();\r\n }\r\n\r\n public confirm(): Promise {\r\n return this.close();\r\n }\r\n\r\n private _checkComposed(composed: Record>) {\r\n for (const key in composed) {\r\n if (Object.prototype.hasOwnProperty.call(composed, key)) {\r\n const property = composed[key];\r\n this._checkValidatedObservable(property, key);\r\n }\r\n }\r\n }\r\n\r\n\r\n private _checkValidatedObservable(obs: ValidationObservable, key: string) {\r\n if (ko.isObservable(obs.isValid) && !obs.isValid()) {\r\n this._addError(obs, key);\r\n }\r\n const unwrapped = ko.unwrap(obs);\r\n if (Array.isArray(unwrapped)) {\r\n unwrapped.forEach((elem: any, index: number) => {\r\n if (ko.isObservable(elem)) {\r\n this._checkValidatedObservable(elem as ValidationObservable, `${key}.${index}`);\r\n } else {\r\n this._checkComposed(elem);\r\n }\r\n });\r\n }\r\n }\r\n\r\n\r\n private _addError(property: ValidationObservable, key: string) {\r\n // displayName is an optional field for validation objects,\r\n // see knockout-extension.ts\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\r\n const nameProp = (property as any).displayName as string | (() => string);\r\n const name = typeof nameProp === \"function\" ? nameProp() : nameProp;\r\n this.items.push(`${name ?? key}: ${property.error()}`);\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/ban-ts-comment */\r\n/* eslint-disable @typescript-eslint/no-unsafe-call */\r\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\r\n/* eslint-disable @typescript-eslint/no-unsafe-return */\r\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n// eslint-disable-next-line @typescript-eslint/triple-slash-reference\r\n/// \r\n\r\nimport \"bootstrap\";\r\nimport \"bootstrap-datepicker\";\r\nimport \"bootstrap-multimodal/js/multimodal\";\r\nimport \"css/bootstrap-datepicker3.css\";\r\nimport $ from \"jquery\";\r\n\r\nimport { FineUploader } from \"fine-uploader\";\r\nimport ko, { MaybeSubscribable, AllBindings } from \"knockout\";\r\nimport log from \"loglevel\";\r\n\r\nimport \"knockout.validation\";\r\nimport moment from \"moment\";\r\n\r\nfunction extractField(record: any, propName: string): any {\r\n const r = ko.unwrap(record[propName]);\r\n if (r) {\r\n return r;\r\n }\r\n if (record.fields) {\r\n return record.getValue(propName);\r\n }\r\n}\r\n\r\n// Copies a string to the clipboard. Must be called from within an\r\n// event handler such as click. May return false if it failed, but\r\n// this is not always possible. Browser support for Chrome 43+,\r\n// Firefox 42+, Safari 10+, Edge and IE 10+.\r\n// IE: The clipboard feature may be disabled by an administrator. By\r\n// default a prompt is shown the first time the clipboard is\r\n// used (per session).\r\nfunction copyToClipboard(text: string) {\r\n // @ts-ignore\r\n if (window.clipboardData && window.clipboardData.setData) {\r\n // IE specific code path to prevent textarea being shown while dialog is visible.\r\n // @ts-ignore\r\n return clipboardData.setData(\"Text\", text);\r\n } else if (document.queryCommandSupported && document.queryCommandSupported(\"copy\")) {\r\n const textarea = document.createElement(\"textarea\");\r\n textarea.textContent = text;\r\n textarea.style.position = \"fixed\"; // Prevent scrolling to bottom of page in MS Edge.\r\n document.body.appendChild(textarea);\r\n textarea.select();\r\n try {\r\n return document.execCommand(\"copy\"); // Security exception may be thrown by some browsers.\r\n } catch (ex) {\r\n window.prompt(\"Please use the following URL\", text);\r\n } finally {\r\n document.body.removeChild(textarea);\r\n }\r\n }\r\n}\r\n\r\nexport default function () {\r\n // @ts-ignore\r\n ko.observableArray.fn.insertAt = function (index: number, value: any) {\r\n this.valueWillMutate();\r\n this.splice(index, 0, value);\r\n this.valueHasMutated();\r\n };\r\n\r\n ko.extenders.displayName = function (obs, options) {\r\n obs.displayName = options;\r\n };\r\n\r\n ko.validation.rules[\"simpleDate\"] = {\r\n message: \"Invalid date, expected format: MM/DD/YYYY\",\r\n validator: (val: any, format: any) => {\r\n if (!val) {\r\n return true;\r\n }\r\n return moment(val, format, true).isValid();\r\n },\r\n };\r\n\r\n ko.validation.rules[\"minArrayLength\"] = {\r\n message: \"Must have at least {0} {1}\",\r\n validator: (obj: any[], minLength: number) => {\r\n return obj.length >= minLength;\r\n },\r\n };\r\n\r\n const insertValidationMessage = ko.validation.insertValidationMessage;\r\n ko.validation.insertValidationMessage = function (element) {\r\n if ($(element.parentElement).hasClass(\"input-group\")) {\r\n return insertValidationMessage(element.parentElement);\r\n }\r\n return insertValidationMessage(element);\r\n };\r\n\r\n ko.bindingHandlers.booleanValue = {\r\n init(element: Node, valueAccessor: () => MaybeSubscribable, allBindings: AllBindings, viewModel: any) {\r\n const observable = valueAccessor();\r\n const interceptor = ko.computed({\r\n read() {\r\n return observable().toString();\r\n },\r\n write(newValue) {\r\n observable(newValue === \"true\");\r\n },\r\n });\r\n\r\n ko.applyBindingsToNode(element, { value: interceptor }, viewModel);\r\n },\r\n };\r\n\r\n ko.bindingHandlers.modal = {\r\n init(element: Node, valueAccessor: () => MaybeSubscribable, allBindings: AllBindings) {\r\n $(element)\r\n .addClass(\"modal\")\r\n .modal({\r\n backdrop: allBindings().autoclose ? true : \"static\",\r\n keyboard: allBindings().autoclose ? true : false,\r\n show: false,\r\n });\r\n const value = valueAccessor();\r\n if (ko.isObservable(value)) {\r\n $(element).on(\"hidden.bs.modal\", function () {\r\n value(false);\r\n });\r\n }\r\n },\r\n update(element, valueAccessor) {\r\n const value = valueAccessor();\r\n if (ko.utils.unwrapObservable(value)) {\r\n $(element).modal(\"show\");\r\n } else {\r\n $(element).modal(\"hide\");\r\n }\r\n },\r\n };\r\n\r\n ko.bindingHandlers.sortable = {\r\n init(element: Node, valueAccessor: () => MaybeSubscribable) {\r\n const el = $(element);\r\n let asc = false;\r\n el.css(\"cursor\", \"pointer\");\r\n el.on(\"click\", () => {\r\n const value = valueAccessor();\r\n const prop = value.prop;\r\n const data = value.arr;\r\n\r\n asc = !asc;\r\n\r\n data.sort(function (left: any, right: any) {\r\n let rec1 = left;\r\n let rec2 = right;\r\n\r\n if (!asc) {\r\n rec1 = right;\r\n rec2 = left;\r\n }\r\n\r\n const props = prop.split(\".\");\r\n for (const i in props) {\r\n let propName = props[i];\r\n const parenIndex = propName.indexOf(\"()\");\r\n if (parenIndex > 0) {\r\n log.warn(`Deprecated: ${propName} used with parenthesis.`);\r\n propName = propName.substring(0, parenIndex);\r\n }\r\n rec1 = extractField(rec1, propName);\r\n rec2 = extractField(rec2, propName);\r\n }\r\n rec1 = rec1 === undefined ? \"\" : rec1;\r\n rec2 = rec2 === undefined ? \"\" : rec2;\r\n\r\n return rec1 === rec2 ? 0 : rec1 < rec2 ? -1 : 1;\r\n });\r\n });\r\n },\r\n };\r\n\r\n ko.bindingHandlers.uploader = {\r\n init(element, valueAccessor, allBindingsAccessor) {\r\n const value = ko.unwrap(valueAccessor());\r\n const allBindings = ko.unwrap(allBindingsAccessor());\r\n const onSucess = allBindings.onSucess;\r\n const onFailure = allBindings.onFailure;\r\n\r\n // eslint-disable-next-line prefer-const\r\n let uploader: FineUploader;\r\n const beforeUpload = (id: any, name: string) => {\r\n if (allBindings.beforeUpload) {\r\n return allBindings.beforeUpload(uploader, id, name);\r\n } else {\r\n return false;\r\n }\r\n };\r\n const onComplete = (id: any, fileName: any, responseJSON: any) => {\r\n if (responseJSON.success) {\r\n if (onSucess) {\r\n onSucess(\r\n responseJSON.file ? JSON.parse(responseJSON.file) : undefined,\r\n responseJSON.recipe ? JSON.parse(responseJSON.recipe) : undefined\r\n );\r\n uploader.removeFileRef(id);\r\n const item = uploader.getItemByFileId(id);\r\n if (item) {\r\n item.remove();\r\n }\r\n }\r\n } else {\r\n if (onFailure) {\r\n onFailure(responseJSON.error, fileName);\r\n }\r\n }\r\n };\r\n const options = $.extend(\r\n {\r\n autoUpload: true,\r\n callbacks: {\r\n onComplete: onComplete,\r\n onUpload: beforeUpload,\r\n },\r\n element,\r\n onError(id: any, name: any, errorReason: any) {\r\n alert(`Error on file number ${id} - ${name}. Reason: ${errorReason}`);\r\n },\r\n request: {\r\n forceMultipart: false,\r\n },\r\n },\r\n value\r\n );\r\n\r\n uploader = new FineUploader(options);\r\n },\r\n update() {\r\n // This will be called once when the binding is first applied to an element,\r\n // and again whenever the associated observable changes value.\r\n // Update the DOM element based on the supplied values here.\r\n },\r\n };\r\n\r\n ko.bindingHandlers.floating = {\r\n after: [\"table\"],\r\n init(element: Node) {\r\n $(element).toggleClass(\"floating\");\r\n $(element).parents(\".form-group\").toggleClass(\"floating\");\r\n $(element)\r\n .on(\"focus blur\", function (e) {\r\n $(this)\r\n .parents(\".form-group\")\r\n .toggleClass(\"focused\", e.type === \"focus\" || (this instanceof HTMLInputElement && this.value.length > 0));\r\n })\r\n .trigger(\"blur\");\r\n },\r\n };\r\n\r\n ko.bindingHandlers.copyToClipboard = {\r\n init(element: Node, valueAccessor: () => MaybeSubscribable) {\r\n const el = $(element);\r\n el.on(\"click\", function () {\r\n // Access the value only now, it might have changed since initialization !\r\n copyToClipboard(ko.unwrap(valueAccessor()));\r\n });\r\n },\r\n };\r\n\r\n ko.bindingHandlers.scrollTo = {\r\n update(element: HTMLElement, valueAccessor) {\r\n const value = ko.utils.unwrapObservable(valueAccessor());\r\n if (value) {\r\n setTimeout(() => element.scrollIntoView(true), 20);\r\n }\r\n },\r\n };\r\n}\r\n","import \"bootstrap\";\r\nimport \"bootstrap-datepicker\";\r\nimport \"css/bootstrap-datepicker3.css\"\r\nimport $ from \"jquery\";\r\n\r\nimport ko, { Observable } from \"knockout\";\r\n\r\nconst updateDatePicker = (element: any, valueAccessor: () => Observable) => {\r\n const kodate = ko.utils.unwrapObservable(valueAccessor());\r\n if (!kodate) {\r\n // null, empty strings both are treated as no date set.\r\n $(element).datepicker('clearDates');\r\n } else {\r\n const date = kodate instanceof Date ? kodate : new Date(kodate);\r\n $(element).datepicker('update', date);\r\n }\r\n};\r\n\r\nconst updateObservableFromDatePicker = (newDate: Date, valueAccessor: () => Observable) => {\r\n if (!ko.isObservable(valueAccessor())) { return; }\r\n if (newDate && isNaN(newDate.getTime())) {\r\n newDate = null;\r\n }\r\n\r\n const kodate = ko.unwrap(valueAccessor());\r\n const oldDate = kodate instanceof Date ? kodate : new Date(kodate);\r\n if (!newDate && oldDate) {\r\n valueAccessor()(null);\r\n } else if (newDate && (!oldDate || oldDate?.getTime() !== newDate?.getTime())) {\r\n valueAccessor()(newDate);\r\n }\r\n};\r\n\r\nexport default function () {\r\n\r\n ko.bindingHandlers.datepicker = {\r\n init: function (element, valueAccessor, allBindingsAccessor) {\r\n /* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\r\n const optionsvalue = ko.unwrap(allBindingsAccessor().datepickerOptions);\r\n const options: DatepickerOptions = $.extend(\r\n {\r\n autoclose: true,\r\n assumeNearbyYear: true,\r\n daysOfWeekHighlighted: [0, 6],\r\n enableOnReadonly: false,\r\n format: \"mm/dd/yyyy\",\r\n todayHighlight: true,\r\n },\r\n optionsvalue\r\n );\r\n /* eslint-enable @typescript-eslint/no-unsafe-assignment */\r\n\r\n $(element).datepicker(options);\r\n updateDatePicker(element, valueAccessor);\r\n\r\n //when a user changes the date in the date picker\r\n ko.utils.registerEventHandler(element, \"changeDate\", function (event) {\r\n const newDate = (event as DatepickerEventObject).date;\r\n updateObservableFromDatePicker(newDate, valueAccessor);\r\n });\r\n // Some changes in the field only fire the onchange event\r\n // (could probably also use onblur for that).\r\n // We have to do the sync with the datepicker & observable her2\r\n /* eslint-disable @typescript-eslint/no-unsafe-member-access */\r\n /* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n ko.utils.registerEventHandler(element, \"change\", function (event: Event) {\r\n const newDate = element.value instanceof Date ? element.value : new Date(element.value);\r\n updateObservableFromDatePicker(newDate, valueAccessor);\r\n });\r\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\r\n /* eslint-enable @typescript-eslint/no-unsafe-assignment */\r\n },\r\n update: updateDatePicker,\r\n\r\n };\r\n\r\n}\r\n\r\n\r\n","/* eslint-disable @typescript-eslint/no-unsafe-call */\r\n/* eslint-disable @typescript-eslint/no-unsafe-return */\r\n/* eslint-disable @typescript-eslint/ban-ts-comment */\r\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\r\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n\r\nimport $ from \"jquery\";\r\nimport ko, { BindingContext, AllBindings, MaybeSubscribable } from \"knockout\";\r\nimport \"select2\";\r\n// tslint:disable-next-line: no-duplicate-imports\r\nimport { IdTextPair, OptionData, SearchOptions } from \"select2\";\r\n\r\n/**\r\n * Custom binding for select with knockout\r\n *\r\n * Based on cruikshj/knockout-select2\r\n * https://github.com/cruikshj/knockout-select2\r\n *\r\n * (MIT license)\r\n *\r\n * knockout-select2 is not available via npm, furthermore,\r\n * made some adaptions for using with typescript.\r\n *\r\n */\r\n\r\nlet select2query: SearchOptions;\r\n\r\n// tslint:disable:only-arrow-functions\r\nexport default function () {\r\n\r\n\r\n /**\r\n * Sort drop down elements with matching prefix first.\r\n * Especially for Materials that are composed of elements,\r\n * this pulls the element itself to the top when it's symbol is entered,\r\n * making it more convenient to select Te or Se as a material.\r\n *\r\n * Based on\r\n * https://github.com/select2/select2/issues/4694\r\n *\r\n */\r\n function prefixPreferredSorter(data: Array): Array {\r\n if (data && data.length > 0 && select2query) {\r\n const searchString = select2query.term || \"\";\r\n return data.sort((a: OptionData | IdTextPair, b: OptionData | IdTextPair) => {\r\n const aStr = a.text;\r\n const bStr = b.text;\r\n if (!searchString || searchString === \"\") {\r\n return aStr.localeCompare(bStr);\r\n }\r\n const aStartWithSearch = aStr.startsWith(searchString);\r\n const bStartWithSearch = bStr.startsWith(searchString);\r\n if (aStartWithSearch === bStartWithSearch) {\r\n return aStr.localeCompare(bStr);\r\n }\r\n return aStartWithSearch ? -1 : 1;\r\n });\r\n } else {\r\n return data;\r\n }\r\n }\r\n\r\n\r\n function triggerChangeQuietly($el: JQuery, value: any, binding: any) {\r\n const isObservable = ko.isObservable(binding);\r\n let originalEqualityComparer;\r\n if (isObservable) {\r\n // eslint-disable-next-line @typescript-eslint/unbound-method\r\n originalEqualityComparer = binding.equalityComparer;\r\n binding.equalityComparer = () => true;\r\n }\r\n $el.val(value);\r\n $el.trigger(\"change\");\r\n if (isObservable) {\r\n binding.equalityComparer = originalEqualityComparer;\r\n }\r\n }\r\n\r\n function addTrigger($el: JQuery, allBindings: any) {\r\n let ignoreChange = false;\r\n\r\n $el.on(\"select2:selecting select2:unselecting\", () => ignoreChange = true);\r\n $el.on(\"select2:select select2:unselect\", () => ignoreChange = false);\r\n\r\n // Must be function for jquery to work (this ref)\r\n const trigger = function (value: any) {\r\n if (!ignoreChange) {\r\n // @ts-ignore\r\n triggerChangeQuietly($el, value, this._target || this.target);\r\n }\r\n };\r\n\r\n if (ko.isObservable(allBindings().value)) {\r\n return allBindings().value.subscribe(trigger);\r\n } else if (ko.isObservable(allBindings().selectedOptions)) {\r\n return allBindings().selectedOptions.subscribe(trigger);\r\n }\r\n }\r\n\r\n function extendOptions(allBindings: AllBindings, el: JQuery) {\r\n const options = $.extend({\r\n theme: \"bootstrap\",\r\n width: \"100%\",\r\n }, allBindings().select2);\r\n if (options.tags) {\r\n options.selectOnClose = true;\r\n }\r\n if (options.dropdownParent) {\r\n options.dropdownParent = $(options.dropdownParent);\r\n } else if (options.modalParent) {\r\n // Check if there is a modal parent. If not, ignore that param\r\n const modalParent = el.closest(\".modal-dialog\")\r\n options.dropdownParent = modalParent.length > 0 ? modalParent : undefined;\r\n }\r\n if (options.matchStart) {\r\n options.language = {\r\n searching: (params: SearchOptions) => {\r\n select2query = params;\r\n return \"Searching\";\r\n }\r\n };\r\n options.sorter = prefixPreferredSorter;\r\n }\r\n return options;\r\n }\r\n\r\n function init(\r\n element: Node,\r\n valueAccessor: () => MaybeSubscribable,\r\n allBindings: AllBindings,\r\n viewModel: any,\r\n bindingContext: BindingContext\r\n ) {\r\n let dataChangeHandler: any;\r\n\r\n const $el = $(element);\r\n const subscription = addTrigger($el, allBindings);\r\n\r\n\r\n // Provide a hook for binding to the select2 \"data\" property;\r\n // this property is read-only in select2 so not subscribing.\r\n if (ko.isWriteableObservable(allBindings.get(\"select2Data\"))) {\r\n dataChangeHandler = () => {\r\n if ($el.data(\"select2\")) {\r\n allBindings.get(\"select2Data\")($el.select2(\"data\"));\r\n }\r\n };\r\n $el.on(\"change\", dataChangeHandler);\r\n }\r\n\r\n\r\n // Apply select2\r\n $el.select2(extendOptions(allBindings, $el));\r\n const select2Elem = $(element).data(\"select2\");\r\n\r\n // Bugfix as proposed in https://github.com/select2/select2/issues/4475\r\n // With allowClear on, no drop down should be shown when clearing the field.\r\n // According to comments on the above case, this is still open as of 9/28/2022\r\n select2Elem.$selection.on(\"mousedown\", \".select2-selection__clear\", function (evt) {\r\n // @ts-ignore\r\n select2Elem.close();\r\n // @ts-ignore\r\n select2Elem.$element.val(null).trigger(\"change\");\r\n evt.preventDefault();\r\n });\r\n\r\n // Bugfix as proposed on https://github.com/select2/select2/issues/5993\r\n // Starting with jquery 3.6.0,\r\n // clicking the select field does not focus the search field,\r\n // so searching via keyboard does require users to click search field.\r\n // the above case is still open as of 9/28/2022\r\n $el.on('select2:open', () => {\r\n const searchInput = $el.data('select2').$dropdown.find('.select2-search__field')[0];\r\n if (searchInput) searchInput.focus();\r\n })\r\n\r\n // Destroy select2 on element disposal\r\n ko.utils.domNodeDisposal.addDisposeCallback(element, function () {\r\n // @ts-ignore\r\n const instance = $el.data(\"select2\");\r\n if (instance) {\r\n $el.select2(\"destroy\");\r\n if (dataChangeHandler) {\r\n $el.off(\"change\", dataChangeHandler);\r\n }\r\n if (subscription) {\r\n subscription.dispose();\r\n }\r\n }\r\n });\r\n }\r\n\r\n ko.bindingHandlers.select2 = {\r\n init(...args) {\r\n // Delay to allow other binding handlers to run, as this binding handler depends on options bindings\r\n setTimeout(function () {\r\n init(...args);\r\n }, 0);\r\n }\r\n };\r\n\r\n}\r\n","/* eslint-disable @typescript-eslint/no-unsafe-call */\r\n/* eslint-disable @typescript-eslint/ban-ts-comment */\r\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\r\n/* eslint-disable @typescript-eslint/no-unsafe-return */\r\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\r\nimport \"bootstrap\";\r\nimport $ from \"jquery\";\r\nimport ko, { MaybeSubscribable, AllBindings } from \"knockout\";\r\n\r\nimport \"summernote/summernote\";\r\n\r\nfunction createSummerNotePopOver(optionsBinding: any) {\r\n const airToolbarMenu = [];\r\n airToolbarMenu.push([\"main\", optionsBinding.allowHeading ? [\"style\", \"clear\"] : [\"clear\"]]);\r\n\r\n airToolbarMenu.push(\r\n [\"font\", [\"bold\", \"italic\", \"underline\", \"superscript\", \"subscript\"]]\r\n );\r\n if (optionsBinding.allowHeading) {\r\n airToolbarMenu.push(\r\n [\"color\", [\"color\"]]\r\n );\r\n airToolbarMenu.push(\r\n [\"para\", [\"ul\", \"ol\", \"paragraph\"]]\r\n );\r\n } else {\r\n airToolbarMenu.push(\r\n [\"para\", [\"ul\", \"ol\"]]\r\n );\r\n }\r\n\r\n return {\r\n air: airToolbarMenu,\r\n image: [\r\n [\"imagesize\", [\"imageSize100\", \"imageSize50\", \"imageSize25\"]],\r\n [\"float\", [\"floatLeft\", \"floatRight\", \"floatNone\"]],\r\n [\"remove\", [\"removeMedia\"]]\r\n ],\r\n table: [\r\n [\"add\", [\"addRowDown\", \"addRowUp\", \"addColLeft\", \"addColRight\"]],\r\n [\"delete\", [\"deleteRow\", \"deleteCol\", \"deleteTable\"]]\r\n ],\r\n };\r\n}\r\n\r\nfunction createSummerNoteToolbar(optionsBinding: any) {\r\n const toolbarMenu: any[] = [];\r\n if (optionsBinding.noToolbar) {\r\n return toolbarMenu;\r\n }\r\n toolbarMenu.push(\r\n [\"main\", optionsBinding.allowHeading ? [\"style\", \"clear\", \"undo\", \"redo\"] : [\"clear\", \"undo\", \"redo\"]]\r\n );\r\n toolbarMenu.push(\r\n [\"font\", [\"bold\", \"italic\", \"underline\", \"superscript\", \"subscript\"]]\r\n );\r\n if (optionsBinding.allowHeading) {\r\n toolbarMenu.push(\r\n [\"color\", [\"color\"]]\r\n );\r\n toolbarMenu.push(\r\n [\"para\", [\"ul\", \"ol\", \"paragraph\"]]\r\n );\r\n } else {\r\n toolbarMenu.push(\r\n [\"para\", [\"ul\", \"ol\"]]\r\n );\r\n }\r\n if (optionsBinding.allowImage || optionsBinding.allowTable) {\r\n const insertMenu = [];\r\n if (optionsBinding.allowImage) {\r\n insertMenu.push(\"picture\");\r\n }\r\n if (optionsBinding.allowTable) {\r\n insertMenu.push(\"table\");\r\n }\r\n toolbarMenu.push([\"insert\", insertMenu]);\r\n }\r\n toolbarMenu.push([\"misc\", [\"help\"]]);\r\n return toolbarMenu;\r\n}\r\n\r\n\r\nexport default function () {\r\n\r\n ko.bindingHandlers.richtext = {\r\n init(\r\n element: Node,\r\n valueAccessor: () => MaybeSubscribable,\r\n allBindings: AllBindings\r\n ) {\r\n const value = ko.unwrap(valueAccessor());\r\n const optionsBinding = allBindings().richtextOptions || {};\r\n const $element = $(element);\r\n\r\n\r\n const options = $.extend({\r\n popover: createSummerNotePopOver(optionsBinding),\r\n toolbar: createSummerNoteToolbar(optionsBinding),\r\n }, optionsBinding);\r\n\r\n const updateObservable = () => {\r\n // @ts-ignore\r\n valueAccessor()($element.summernote(\"code\"));\r\n return true;\r\n };\r\n\r\n options.callbacks = {};\r\n options.callbacks.onBlur = updateObservable;\r\n options.callbacks.onChange = updateObservable;\r\n options.callbacks.onPaste = updateObservable;\r\n // @ts-ignore\r\n $element.html(value).summernote(options).summernote(\"removeModule\", \"autoLink\");\r\n },\r\n update(element, valueAccessor) {\r\n const value = ko.unwrap(valueAccessor());\r\n\r\n // This method gets called whenever our observable in the view model changes,\r\n // even if we just wrote the data from the richtext field into the observable\r\n // => In this case, observable and richtext field are already in sync.\r\n // Any call to summernote here might move the cursor or do strang things, and would be\r\n // unnessary anyway\r\n // @ts-ignore\r\n if (value !== $(element).summernote(\"code\")) {\r\n // @ts-ignore\r\n $(element).summernote(\"code\", value);\r\n }\r\n }\r\n };\r\n}\r\n\r\n","import log from \"loglevel\";\r\n\r\n/**\r\n * Toggle logging on Ctrl-F12\r\n */\r\nexport default function initLogging() {\r\n log.setDefaultLevel(\"error\");\r\n\r\n let isCtrl = false;\r\n $(document).on(\"keyup\", (e) => {\r\n if (e.which === 17) {\r\n isCtrl = false;\r\n }\r\n });\r\n $(document).on(\"keydown\", (e) => {\r\n if (e.which === 17) {\r\n isCtrl = true;\r\n }\r\n if (e.which === 123 && isCtrl) {\r\n switch (log.getLevel()) {\r\n case log.levels.INFO:\r\n log.setLevel(\"debug\");\r\n log.info(\"Logging turned to debug\");\r\n break;\r\n case log.levels.DEBUG:\r\n log.setLevel(\"trace\");\r\n log.info(\"Logging turned to trace\");\r\n break;\r\n case log.levels.TRACE:\r\n log.setLevel(\"error\");\r\n log.info(\"Logging turned to error\");\r\n break;\r\n default:\r\n log.setLevel(log.levels.INFO);\r\n log.info(\"Logging turned to info\");\r\n }\r\n }\r\n });\r\n}\r\n","var map = {\n\t\"./es-us\": 56575,\n\t\"./es-us.js\": 56575,\n\t\"moment/locale/es-us\": 56575,\n\t\"moment/locale/es-us.js\": 56575\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 22449;","/*! Responsive 3.0.3\n * © SpryMedia Ltd - datatables.net/license\n */\n\nimport jQuery from 'jquery';\nimport DataTable from 'datatables.net';\n\n// Allow reassignment of the $ variable\nlet $ = jQuery;\n\n\n/**\n * @summary Responsive\n * @description Responsive tables plug-in for DataTables\n * @version 3.0.3\n * @author SpryMedia Ltd\n * @copyright SpryMedia Ltd.\n *\n * This source file is free software, available under the following license:\n * MIT license - http://datatables.net/license/mit\n *\n * This source file is distributed in the hope that it will be useful, but\n * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY\n * or FITNESS FOR A PARTICULAR PURPOSE. See the license files for details.\n *\n * For details please refer to: http://www.datatables.net\n */\n\n/**\n * Responsive is a plug-in for the DataTables library that makes use of\n * DataTables' ability to change the visibility of columns, changing the\n * visibility of columns so the displayed columns fit into the table container.\n * The end result is that complex tables will be dynamically adjusted to fit\n * into the viewport, be it on a desktop, tablet or mobile browser.\n *\n * Responsive for DataTables has two modes of operation, which can used\n * individually or combined:\n *\n * * Class name based control - columns assigned class names that match the\n * breakpoint logic can be shown / hidden as required for each breakpoint.\n * * Automatic control - columns are automatically hidden when there is no\n * room left to display them. Columns removed from the right.\n *\n * In additional to column visibility control, Responsive also has built into\n * options to use DataTables' child row display to show / hide the information\n * from the table that has been hidden. There are also two modes of operation\n * for this child row display:\n *\n * * Inline - when the control element that the user can use to show / hide\n * child rows is displayed inside the first column of the table.\n * * Column - where a whole column is dedicated to be the show / hide control.\n *\n * Initialisation of Responsive is performed by:\n *\n * * Adding the class `responsive` or `dt-responsive` to the table. In this case\n * Responsive will automatically be initialised with the default configuration\n * options when the DataTable is created.\n * * Using the `responsive` option in the DataTables configuration options. This\n * can also be used to specify the configuration options, or simply set to\n * `true` to use the defaults.\n *\n * @class\n * @param {object} settings DataTables settings object for the host table\n * @param {object} [opts] Configuration options\n * @requires jQuery 1.7+\n * @requires DataTables 1.10.3+\n *\n * @example\n * $('#example').DataTable( {\n * responsive: true\n * } );\n * } );\n */\nvar Responsive = function (settings, opts) {\n\t// Sanity check that we are using DataTables 1.10 or newer\n\tif (!DataTable.versionCheck || !DataTable.versionCheck('2')) {\n\t\tthrow 'DataTables Responsive requires DataTables 2 or newer';\n\t}\n\n\tthis.s = {\n\t\tchildNodeStore: {},\n\t\tcolumns: [],\n\t\tcurrent: [],\n\t\tdt: new DataTable.Api(settings)\n\t};\n\n\t// Check if responsive has already been initialised on this table\n\tif (this.s.dt.settings()[0].responsive) {\n\t\treturn;\n\t}\n\n\t// details is an object, but for simplicity the user can give it as a string\n\t// or a boolean\n\tif (opts && typeof opts.details === 'string') {\n\t\topts.details = { type: opts.details };\n\t}\n\telse if (opts && opts.details === false) {\n\t\topts.details = { type: false };\n\t}\n\telse if (opts && opts.details === true) {\n\t\topts.details = { type: 'inline' };\n\t}\n\n\tthis.c = $.extend(\n\t\ttrue,\n\t\t{},\n\t\tResponsive.defaults,\n\t\tDataTable.defaults.responsive,\n\t\topts\n\t);\n\tsettings.responsive = this;\n\tthis._constructor();\n};\n\n$.extend(Responsive.prototype, {\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Constructor\n\t */\n\n\t/**\n\t * Initialise the Responsive instance\n\t *\n\t * @private\n\t */\n\t_constructor: function () {\n\t\tvar that = this;\n\t\tvar dt = this.s.dt;\n\t\tvar oldWindowWidth = $(window).innerWidth();\n\n\t\tdt.settings()[0]._responsive = this;\n\n\t\t// Use DataTables' throttle function to avoid processor thrashing\n\t\t$(window).on(\n\t\t\t'orientationchange.dtr',\n\t\t\tDataTable.util.throttle(function () {\n\t\t\t\t// iOS has a bug whereby resize can fire when only scrolling\n\t\t\t\t// See: http://stackoverflow.com/questions/8898412\n\t\t\t\tvar width = $(window).innerWidth();\n\n\t\t\t\tif (width !== oldWindowWidth) {\n\t\t\t\t\tthat._resize();\n\t\t\t\t\toldWindowWidth = width;\n\t\t\t\t}\n\t\t\t})\n\t\t);\n\n\t\t// Handle new rows being dynamically added - needed as responsive\n\t\t// updates all rows (shown or not) a responsive change, rather than\n\t\t// per draw.\n\t\tdt.on('row-created.dtr', function (e, tr, data, idx) {\n\t\t\tif ($.inArray(false, that.s.current) !== -1) {\n\t\t\t\t$('>td, >th', tr).each(function (i) {\n\t\t\t\t\tvar idx = dt.column.index('toData', i);\n\n\t\t\t\t\tif (that.s.current[idx] === false) {\n\t\t\t\t\t\t$(this)\n\t\t\t\t\t\t\t.css('display', 'none')\n\t\t\t\t\t\t\t.addClass('dtr-hidden');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\n\t\t// Destroy event handler\n\t\tdt.on('destroy.dtr', function () {\n\t\t\tdt.off('.dtr');\n\t\t\t$(dt.table().body()).off('.dtr');\n\t\t\t$(window).off('resize.dtr orientationchange.dtr');\n\t\t\tdt.cells('.dtr-control').nodes().to$().removeClass('dtr-control');\n\t\t\t$(dt.table().node()).removeClass('dtr-inline collapsed');\n\n\t\t\t// Restore the columns that we've hidden\n\t\t\t$.each(that.s.current, function (i, val) {\n\t\t\t\tif (val === false) {\n\t\t\t\t\tthat._setColumnVis(i, true);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// Reorder the breakpoints array here in case they have been added out\n\t\t// of order\n\t\tthis.c.breakpoints.sort(function (a, b) {\n\t\t\treturn a.width < b.width ? 1 : a.width > b.width ? -1 : 0;\n\t\t});\n\n\t\tthis._classLogic();\n\n\t\t// Details handler\n\t\tvar details = this.c.details;\n\n\t\tif (details.type !== false) {\n\t\t\tthat._detailsInit();\n\n\t\t\t// DataTables will trigger this event on every column it shows and\n\t\t\t// hides individually\n\t\t\tdt.on('column-visibility.dtr', function () {\n\t\t\t\t// Use a small debounce to allow multiple columns to be set together\n\t\t\t\tif (that._timer) {\n\t\t\t\t\tclearTimeout(that._timer);\n\t\t\t\t}\n\n\t\t\t\tthat._timer = setTimeout(function () {\n\t\t\t\t\tthat._timer = null;\n\n\t\t\t\t\tthat._classLogic();\n\t\t\t\t\tthat._resizeAuto();\n\t\t\t\t\tthat._resize(true);\n\n\t\t\t\t\tthat._redrawChildren();\n\t\t\t\t}, 100);\n\t\t\t});\n\n\t\t\t// Redraw the details box on each draw which will happen if the data\n\t\t\t// has changed. This is used until DataTables implements a native\n\t\t\t// `updated` event for rows\n\t\t\tdt.on('draw.dtr', function () {\n\t\t\t\tthat._redrawChildren();\n\t\t\t});\n\n\t\t\t$(dt.table().node()).addClass('dtr-' + details.type);\n\t\t}\n\n\t\t// DT2 let's us tell it if we are hiding columns\n\t\tdt.on('column-calc.dt', function (e, d) {\n\t\t\tvar curr = that.s.current;\n\n\t\t\tfor (var i = 0; i < curr.length; i++) {\n\t\t\t\tvar idx = d.visible.indexOf(i);\n\n\t\t\t\tif (curr[i] === false && idx >= 0) {\n\t\t\t\t\td.visible.splice(idx, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// On Ajax reload we want to reopen any child rows which are displayed\n\t\t// by responsive\n\t\tdt.on('preXhr.dtr', function () {\n\t\t\tvar rowIds = [];\n\t\t\tdt.rows().every(function () {\n\t\t\t\tif (this.child.isShown()) {\n\t\t\t\t\trowIds.push(this.id(true));\n\t\t\t\t}\n\t\t\t});\n\n\t\t\tdt.one('draw.dtr', function () {\n\t\t\t\tthat._resizeAuto();\n\t\t\t\tthat._resize();\n\n\t\t\t\tdt.rows(rowIds).every(function () {\n\t\t\t\t\tthat._detailsDisplay(this, false);\n\t\t\t\t});\n\t\t\t});\n\t\t});\n\n\t\t// First pass when the table is ready\n\t\tdt\n\t\t\t.on('draw.dtr', function () {\n\t\t\t\tthat._controlClass();\n\t\t\t})\n\t\t\t.ready(function () {\n\t\t\t\tthat._resizeAuto();\n\t\t\t\tthat._resize();\n\n\t\t\t\t// Attach listeners after first pass\n\t\t\t\tdt.on('column-reorder.dtr', function (e, settings, details) {\n\t\t\t\t\tthat._classLogic();\n\t\t\t\t\tthat._resizeAuto();\n\t\t\t\t\tthat._resize(true);\n\t\t\t\t});\n\n\t\t\t\t// Change in column sizes means we need to calc\n\t\t\t\tdt.on('column-sizing.dtr', function () {\n\t\t\t\t\tthat._resizeAuto();\n\t\t\t\t\tthat._resize();\n\t\t\t\t});\n\t\t\t});\n\t},\n\n\t/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *\n\t * Private methods\n\t */\n\n\t/**\n\t * Insert a `col` tag into the correct location in a `colgroup`.\n\t *\n\t * @param {jQuery} colGroup The `colgroup` tag\n\t * @param {jQuery} colEl The `col` tag\n\t */\n\t_colGroupAttach: function (colGroup, colEls, idx) {\n\t\tvar found = null;\n\n\t\t// No need to do anything if already attached\n\t\tif (colEls[idx].get(0).parentNode === colGroup[0]) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Find the first `col` after our own which is already attached\n\t\tfor (var i = idx+1; i < colEls.length; i++) {\n\t\t\tif (colGroup[0] === colEls[i].get(0).parentNode) {\n\t\t\t\tfound = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (found !== null) {\n\t\t\t// Insert before\n\t\t\tcolEls[idx].insertBefore(colEls[found][0]);\n\t\t}\n\t\telse {\n\t\t\t// If wasn't found, insert at the end\n\t\t\tcolGroup.append(colEls[idx]);\n\t\t}\n\t},\n\n\t/**\n\t * Get and store nodes from a cell - use for node moving renderers\n\t *\n\t * @param {*} dt DT instance\n\t * @param {*} row Row index\n\t * @param {*} col Column index\n\t */\n\t_childNodes: function (dt, row, col) {\n\t\tvar name = row + '-' + col;\n\n\t\tif (this.s.childNodeStore[name]) {\n\t\t\treturn this.s.childNodeStore[name];\n\t\t}\n\n\t\t// https://jsperf.com/childnodes-array-slice-vs-loop\n\t\tvar nodes = [];\n\t\tvar children = dt.cell(row, col).node().childNodes;\n\t\tfor (var i = 0, ien = children.length; i < ien; i++) {\n\t\t\tnodes.push(children[i]);\n\t\t}\n\n\t\tthis.s.childNodeStore[name] = nodes;\n\n\t\treturn nodes;\n\t},\n\n\t/**\n\t * Restore nodes from the cache to a table cell\n\t *\n\t * @param {*} dt DT instance\n\t * @param {*} row Row index\n\t * @param {*} col Column index\n\t */\n\t_childNodesRestore: function (dt, row, col) {\n\t\tvar name = row + '-' + col;\n\n\t\tif (!this.s.childNodeStore[name]) {\n\t\t\treturn;\n\t\t}\n\n\t\tvar node = dt.cell(row, col).node();\n\t\tvar store = this.s.childNodeStore[name];\n\t\tif (store.length > 0) {\n\t\t\tvar parent = store[0].parentNode;\n\t\t\tvar parentChildren = parent.childNodes;\n\t\t\tvar a = [];\n\n\t\t\tfor (var i = 0, ien = parentChildren.length; i < ien; i++) {\n\t\t\t\ta.push(parentChildren[i]);\n\t\t\t}\n\n\t\t\tfor (var j = 0, jen = a.length; j < jen; j++) {\n\t\t\t\tnode.appendChild(a[j]);\n\t\t\t}\n\t\t}\n\n\t\tthis.s.childNodeStore[name] = undefined;\n\t},\n\n\t/**\n\t * Calculate the visibility for the columns in a table for a given\n\t * breakpoint. The result is pre-determined based on the class logic if\n\t * class names are used to control all columns, but the width of the table\n\t * is also used if there are columns which are to be automatically shown\n\t * and hidden.\n\t *\n\t * @param {string} breakpoint Breakpoint name to use for the calculation\n\t * @return {array} Array of boolean values initiating the visibility of each\n\t * column.\n\t * @private\n\t */\n\t_columnsVisiblity: function (breakpoint) {\n\t\tvar dt = this.s.dt;\n\t\tvar columns = this.s.columns;\n\t\tvar i, ien;\n\n\t\t// Create an array that defines the column ordering based first on the\n\t\t// column's priority, and secondly the column index. This allows the\n\t\t// columns to be removed from the right if the priority matches\n\t\tvar order = columns\n\t\t\t.map(function (col, idx) {\n\t\t\t\treturn {\n\t\t\t\t\tcolumnIdx: idx,\n\t\t\t\t\tpriority: col.priority\n\t\t\t\t};\n\t\t\t})\n\t\t\t.sort(function (a, b) {\n\t\t\t\tif (a.priority !== b.priority) {\n\t\t\t\t\treturn a.priority - b.priority;\n\t\t\t\t}\n\t\t\t\treturn a.columnIdx - b.columnIdx;\n\t\t\t});\n\n\t\t// Class logic - determine which columns are in this breakpoint based\n\t\t// on the classes. If no class control (i.e. `auto`) then `-` is used\n\t\t// to indicate this to the rest of the function\n\t\tvar display = $.map(columns, function (col, i) {\n\t\t\tif (dt.column(i).visible() === false) {\n\t\t\t\treturn 'not-visible';\n\t\t\t}\n\t\t\treturn col.auto && col.minWidth === null\n\t\t\t\t? false\n\t\t\t\t: col.auto === true\n\t\t\t\t? '-'\n\t\t\t\t: $.inArray(breakpoint, col.includeIn) !== -1;\n\t\t});\n\n\t\t// Auto column control - first pass: how much width is taken by the\n\t\t// ones that must be included from the non-auto columns\n\t\tvar requiredWidth = 0;\n\t\tfor (i = 0, ien = display.length; i < ien; i++) {\n\t\t\tif (display[i] === true) {\n\t\t\t\trequiredWidth += columns[i].minWidth;\n\t\t\t}\n\t\t}\n\n\t\t// Second pass, use up any remaining width for other columns. For\n\t\t// scrolling tables we need to subtract the width of the scrollbar. It\n\t\t// may not be requires which makes this sub-optimal, but it would\n\t\t// require another full redraw to make complete use of those extra few\n\t\t// pixels\n\t\tvar scrolling = dt.settings()[0].oScroll;\n\t\tvar bar = scrolling.sY || scrolling.sX ? scrolling.iBarWidth : 0;\n\t\tvar widthAvailable = dt.table().container().offsetWidth - bar;\n\t\tvar usedWidth = widthAvailable - requiredWidth;\n\n\t\t// Control column needs to always be included. This makes it sub-\n\t\t// optimal in terms of using the available with, but to stop layout\n\t\t// thrashing or overflow. Also we need to account for the control column\n\t\t// width first so we know how much width is available for the other\n\t\t// columns, since the control column might not be the first one shown\n\t\tfor (i = 0, ien = display.length; i < ien; i++) {\n\t\t\tif (columns[i].control) {\n\t\t\t\tusedWidth -= columns[i].minWidth;\n\t\t\t}\n\t\t}\n\n\t\t// Allow columns to be shown (counting by priority and then right to\n\t\t// left) until we run out of room\n\t\tvar empty = false;\n\t\tfor (i = 0, ien = order.length; i < ien; i++) {\n\t\t\tvar colIdx = order[i].columnIdx;\n\n\t\t\tif (\n\t\t\t\tdisplay[colIdx] === '-' &&\n\t\t\t\t!columns[colIdx].control &&\n\t\t\t\tcolumns[colIdx].minWidth\n\t\t\t) {\n\t\t\t\t// Once we've found a column that won't fit we don't let any\n\t\t\t\t// others display either, or columns might disappear in the\n\t\t\t\t// middle of the table\n\t\t\t\tif (empty || usedWidth - columns[colIdx].minWidth < 0) {\n\t\t\t\t\tempty = true;\n\t\t\t\t\tdisplay[colIdx] = false;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tdisplay[colIdx] = true;\n\t\t\t\t}\n\n\t\t\t\tusedWidth -= columns[colIdx].minWidth;\n\t\t\t}\n\t\t}\n\n\t\t// Determine if the 'control' column should be shown (if there is one).\n\t\t// This is the case when there is a hidden column (that is not the\n\t\t// control column). The two loops look inefficient here, but they are\n\t\t// trivial and will fly through. We need to know the outcome from the\n\t\t// first , before the action in the second can be taken\n\t\tvar showControl = false;\n\n\t\tfor (i = 0, ien = columns.length; i < ien; i++) {\n\t\t\tif (\n\t\t\t\t!columns[i].control &&\n\t\t\t\t!columns[i].never &&\n\t\t\t\tdisplay[i] === false\n\t\t\t) {\n\t\t\t\tshowControl = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tfor (i = 0, ien = columns.length; i < ien; i++) {\n\t\t\tif (columns[i].control) {\n\t\t\t\tdisplay[i] = showControl;\n\t\t\t}\n\n\t\t\t// Replace not visible string with false from the control column detection above\n\t\t\tif (display[i] === 'not-visible') {\n\t\t\t\tdisplay[i] = false;\n\t\t\t}\n\t\t}\n\n\t\t// Finally we need to make sure that there is at least one column that\n\t\t// is visible\n\t\tif ($.inArray(true, display) === -1) {\n\t\t\tdisplay[0] = true;\n\t\t}\n\n\t\treturn display;\n\t},\n\n\t/**\n\t * Create the internal `columns` array with information about the columns\n\t * for the table. This includes determining which breakpoints the column\n\t * will appear in, based upon class names in the column, which makes up the\n\t * vast majority of this method.\n\t *\n\t * @private\n\t */\n\t_classLogic: function () {\n\t\tvar that = this;\n\t\tvar breakpoints = this.c.breakpoints;\n\t\tvar dt = this.s.dt;\n\t\tvar columns = dt\n\t\t\t.columns()\n\t\t\t.eq(0)\n\t\t\t.map(function (i) {\n\t\t\t\tvar column = this.column(i);\n\t\t\t\tvar className = column.header().className;\n\t\t\t\tvar priority = column.init().responsivePriority;\n\t\t\t\tvar dataPriority = column\n\t\t\t\t\t.header()\n\t\t\t\t\t.getAttribute('data-priority');\n\n\t\t\t\tif (priority === undefined) {\n\t\t\t\t\tpriority =\n\t\t\t\t\t\tdataPriority === undefined || dataPriority === null\n\t\t\t\t\t\t\t? 10000\n\t\t\t\t\t\t\t: dataPriority * 1;\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tclassName: className,\n\t\t\t\t\tincludeIn: [],\n\t\t\t\t\tauto: false,\n\t\t\t\t\tcontrol: false,\n\t\t\t\t\tnever: className.match(/\\b(dtr\\-)?never\\b/) ? true : false,\n\t\t\t\t\tpriority: priority\n\t\t\t\t};\n\t\t\t});\n\n\t\t// Simply add a breakpoint to `includeIn` array, ensuring that there are\n\t\t// no duplicates\n\t\tvar add = function (colIdx, name) {\n\t\t\tvar includeIn = columns[colIdx].includeIn;\n\n\t\t\tif ($.inArray(name, includeIn) === -1) {\n\t\t\t\tincludeIn.push(name);\n\t\t\t}\n\t\t};\n\n\t\tvar column = function (colIdx, name, operator, matched) {\n\t\t\tvar size, i, ien;\n\n\t\t\tif (!operator) {\n\t\t\t\tcolumns[colIdx].includeIn.push(name);\n\t\t\t}\n\t\t\telse if (operator === 'max-') {\n\t\t\t\t// Add this breakpoint and all smaller\n\t\t\t\tsize = that._find(name).width;\n\n\t\t\t\tfor (i = 0, ien = breakpoints.length; i < ien; i++) {\n\t\t\t\t\tif (breakpoints[i].width <= size) {\n\t\t\t\t\t\tadd(colIdx, breakpoints[i].name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (operator === 'min-') {\n\t\t\t\t// Add this breakpoint and all larger\n\t\t\t\tsize = that._find(name).width;\n\n\t\t\t\tfor (i = 0, ien = breakpoints.length; i < ien; i++) {\n\t\t\t\t\tif (breakpoints[i].width >= size) {\n\t\t\t\t\t\tadd(colIdx, breakpoints[i].name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\telse if (operator === 'not-') {\n\t\t\t\t// Add all but this breakpoint\n\t\t\t\tfor (i = 0, ien = breakpoints.length; i < ien; i++) {\n\t\t\t\t\tif (breakpoints[i].name.indexOf(matched) === -1) {\n\t\t\t\t\t\tadd(colIdx, breakpoints[i].name);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\n\t\t// Loop over each column and determine if it has a responsive control\n\t\t// class\n\t\tcolumns.each(function (col, i) {\n\t\t\tvar classNames = col.className.split(' ');\n\t\t\tvar hasClass = false;\n\n\t\t\t// Split the class name up so multiple rules can be applied if needed\n\t\t\tfor (var k = 0, ken = classNames.length; k < ken; k++) {\n\t\t\t\tvar className = classNames[k].trim();\n\n\t\t\t\tif (className === 'all' || className === 'dtr-all') {\n\t\t\t\t\t// Include in all\n\t\t\t\t\thasClass = true;\n\t\t\t\t\tcol.includeIn = $.map(breakpoints, function (a) {\n\t\t\t\t\t\treturn a.name;\n\t\t\t\t\t});\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse if (\n\t\t\t\t\tclassName === 'none' ||\n\t\t\t\t\tclassName === 'dtr-none' ||\n\t\t\t\t\tcol.never\n\t\t\t\t) {\n\t\t\t\t\t// Include in none (default) and no auto\n\t\t\t\t\thasClass = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\telse if (\n\t\t\t\t\tclassName === 'control' ||\n\t\t\t\t\tclassName === 'dtr-control'\n\t\t\t\t) {\n\t\t\t\t\t// Special column that is only visible, when one of the other\n\t\t\t\t\t// columns is hidden. This is used for the details control\n\t\t\t\t\thasClass = true;\n\t\t\t\t\tcol.control = true;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t$.each(breakpoints, function (j, breakpoint) {\n\t\t\t\t\t// Does this column have a class that matches this breakpoint?\n\t\t\t\t\tvar brokenPoint = breakpoint.name.split('-');\n\t\t\t\t\tvar re = new RegExp(\n\t\t\t\t\t\t'(min\\\\-|max\\\\-|not\\\\-)?(' +\n\t\t\t\t\t\t\tbrokenPoint[0] +\n\t\t\t\t\t\t\t')(\\\\-[_a-zA-Z0-9])?'\n\t\t\t\t\t);\n\t\t\t\t\tvar match = className.match(re);\n\n\t\t\t\t\tif (match) {\n\t\t\t\t\t\thasClass = true;\n\n\t\t\t\t\t\tif (\n\t\t\t\t\t\t\tmatch[2] === brokenPoint[0] &&\n\t\t\t\t\t\t\tmatch[3] === '-' + brokenPoint[1]\n\t\t\t\t\t\t) {\n\t\t\t\t\t\t\t// Class name matches breakpoint name fully\n\t\t\t\t\t\t\tcolumn(\n\t\t\t\t\t\t\t\ti,\n\t\t\t\t\t\t\t\tbreakpoint.name,\n\t\t\t\t\t\t\t\tmatch[1],\n\t\t\t\t\t\t\t\tmatch[2] + match[3]\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (match[2] === brokenPoint[0] && !match[3]) {\n\t\t\t\t\t\t\t// Class name matched primary breakpoint name with no qualifier\n\t\t\t\t\t\t\tcolumn(i, breakpoint.name, match[1], match[2]);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// If there was no control class, then automatic sizing is used\n\t\t\tif (!hasClass) {\n\t\t\t\tcol.auto = true;\n\t\t\t}\n\t\t});\n\n\t\tthis.s.columns = columns;\n\t},\n\n\t/**\n\t * Update the cells to show the correct control class / button\n\t * @private\n\t */\n\t_controlClass: function () {\n\t\tif (this.c.details.type === 'inline') {\n\t\t\tvar dt = this.s.dt;\n\t\t\tvar columnsVis = this.s.current;\n\t\t\tvar firstVisible = $.inArray(true, columnsVis);\n\n\t\t\t// Remove from any cells which shouldn't have it\n\t\t\tdt.cells(\n\t\t\t\tnull,\n\t\t\t\tfunction (idx) {\n\t\t\t\t\treturn idx !== firstVisible;\n\t\t\t\t},\n\t\t\t\t{ page: 'current' }\n\t\t\t)\n\t\t\t\t.nodes()\n\t\t\t\t.to$()\n\t\t\t\t.filter('.dtr-control')\n\t\t\t\t.removeClass('dtr-control');\n\n\t\t\tdt.cells(null, firstVisible, { page: 'current' })\n\t\t\t\t.nodes()\n\t\t\t\t.to$()\n\t\t\t\t.addClass('dtr-control');\n\t\t}\n\t},\n\n\t/**\n\t * Show the details for the child row\n\t *\n\t * @param {DataTables.Api} row API instance for the row\n\t * @param {boolean} update Update flag\n\t * @private\n\t */\n\t_detailsDisplay: function (row, update) {\n\t\tvar that = this;\n\t\tvar dt = this.s.dt;\n\t\tvar details = this.c.details;\n\t\tvar event = function (res) {\n\t\t\t$(row.node()).toggleClass('dtr-expanded', res !== false);\n\t\t\t$(dt.table().node()).triggerHandler('responsive-display.dt', [\n\t\t\t\tdt,\n\t\t\t\trow,\n\t\t\t\tres,\n\t\t\t\tupdate\n\t\t\t]);\n\t\t};\n\n\t\tif (details && details.type !== false) {\n\t\t\tvar renderer =\n\t\t\t\ttypeof details.renderer === 'string'\n\t\t\t\t\t? Responsive.renderer[details.renderer]()\n\t\t\t\t\t: details.renderer;\n\n\t\t\tvar res = details.display(\n\t\t\t\trow,\n\t\t\t\tupdate,\n\t\t\t\tfunction () {\n\t\t\t\t\treturn renderer.call(\n\t\t\t\t\t\tthat,\n\t\t\t\t\t\tdt,\n\t\t\t\t\t\trow[0][0],\n\t\t\t\t\t\tthat._detailsObj(row[0])\n\t\t\t\t\t);\n\t\t\t\t},\n\t\t\t\tfunction () {\n\t\t\t\t\tevent(false);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tif (typeof res === 'boolean') {\n\t\t\t\tevent(res);\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Initialisation for the details handler\n\t *\n\t * @private\n\t */\n\t_detailsInit: function () {\n\t\tvar that = this;\n\t\tvar dt = this.s.dt;\n\t\tvar details = this.c.details;\n\n\t\t// The inline type always uses the first child as the target\n\t\tif (details.type === 'inline') {\n\t\t\tdetails.target = 'td.dtr-control, th.dtr-control';\n\t\t}\n\n\t\t// Keyboard accessibility\n\t\tdt.on('draw.dtr', function () {\n\t\t\tthat._tabIndexes();\n\t\t});\n\t\tthat._tabIndexes(); // Initial draw has already happened\n\n\t\t$(dt.table().body()).on('keyup.dtr', 'td, th', function (e) {\n\t\t\tif (e.keyCode === 13 && $(this).data('dtr-keyboard')) {\n\t\t\t\t$(this).click();\n\t\t\t}\n\t\t});\n\n\t\t// type.target can be a string jQuery selector or a column index\n\t\tvar target = details.target;\n\t\tvar selector = typeof target === 'string' ? target : 'td, th';\n\n\t\tif (target !== undefined || target !== null) {\n\t\t\t// Click handler to show / hide the details rows when they are available\n\t\t\t$(dt.table().body()).on(\n\t\t\t\t'click.dtr mousedown.dtr mouseup.dtr',\n\t\t\t\tselector,\n\t\t\t\tfunction (e) {\n\t\t\t\t\t// If the table is not collapsed (i.e. there is no hidden columns)\n\t\t\t\t\t// then take no action\n\t\t\t\t\tif (!$(dt.table().node()).hasClass('collapsed')) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// Check that the row is actually a DataTable's controlled node\n\t\t\t\t\tif (\n\t\t\t\t\t\t$.inArray(\n\t\t\t\t\t\t\t$(this).closest('tr').get(0),\n\t\t\t\t\t\t\tdt.rows().nodes().toArray()\n\t\t\t\t\t\t) === -1\n\t\t\t\t\t) {\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\t// For column index, we determine if we should act or not in the\n\t\t\t\t\t// handler - otherwise it is already okay\n\t\t\t\t\tif (typeof target === 'number') {\n\t\t\t\t\t\tvar targetIdx =\n\t\t\t\t\t\t\ttarget < 0\n\t\t\t\t\t\t\t\t? dt.columns().eq(0).length + target\n\t\t\t\t\t\t\t\t: target;\n\n\t\t\t\t\t\tif (dt.cell(this).index().column !== targetIdx) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\t// $().closest() includes itself in its check\n\t\t\t\t\tvar row = dt.row($(this).closest('tr'));\n\n\t\t\t\t\t// Check event type to do an action\n\t\t\t\t\tif (e.type === 'click') {\n\t\t\t\t\t\t// The renderer is given as a function so the caller can execute it\n\t\t\t\t\t\t// only when they need (i.e. if hiding there is no point is running\n\t\t\t\t\t\t// the renderer)\n\t\t\t\t\t\tthat._detailsDisplay(row, false);\n\t\t\t\t\t}\n\t\t\t\t\telse if (e.type === 'mousedown') {\n\t\t\t\t\t\t// For mouse users, prevent the focus ring from showing\n\t\t\t\t\t\t$(this).css('outline', 'none');\n\t\t\t\t\t}\n\t\t\t\t\telse if (e.type === 'mouseup') {\n\t\t\t\t\t\t// And then re-allow at the end of the click\n\t\t\t\t\t\t$(this).trigger('blur').css('outline', '');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t},\n\n\t/**\n\t * Get the details to pass to a renderer for a row\n\t * @param {int} rowIdx Row index\n\t * @private\n\t */\n\t_detailsObj: function (rowIdx) {\n\t\tvar that = this;\n\t\tvar dt = this.s.dt;\n\n\t\treturn $.map(this.s.columns, function (col, i) {\n\t\t\t// Never and control columns should not be passed to the renderer\n\t\t\tif (col.never || col.control) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar dtCol = dt.settings()[0].aoColumns[i];\n\n\t\t\treturn {\n\t\t\t\tclassName: dtCol.sClass,\n\t\t\t\tcolumnIndex: i,\n\t\t\t\tdata: dt.cell(rowIdx, i).render(that.c.orthogonal),\n\t\t\t\thidden: dt.column(i).visible() && !that.s.current[i],\n\t\t\t\trowIndex: rowIdx,\n\t\t\t\ttitle: dt.column(i).title()\n\t\t\t};\n\t\t});\n\t},\n\n\t/**\n\t * Find a breakpoint object from a name\n\t *\n\t * @param {string} name Breakpoint name to find\n\t * @return {object} Breakpoint description object\n\t * @private\n\t */\n\t_find: function (name) {\n\t\tvar breakpoints = this.c.breakpoints;\n\n\t\tfor (var i = 0, ien = breakpoints.length; i < ien; i++) {\n\t\t\tif (breakpoints[i].name === name) {\n\t\t\t\treturn breakpoints[i];\n\t\t\t}\n\t\t}\n\t},\n\n\t/**\n\t * Re-create the contents of the child rows as the display has changed in\n\t * some way.\n\t *\n\t * @private\n\t */\n\t_redrawChildren: function () {\n\t\tvar that = this;\n\t\tvar dt = this.s.dt;\n\n\t\tdt.rows({ page: 'current' }).iterator('row', function (settings, idx) {\n\t\t\tthat._detailsDisplay(dt.row(idx), true);\n\t\t});\n\t},\n\n\t/**\n\t * Alter the table display for a resized viewport. This involves first\n\t * determining what breakpoint the window currently is in, getting the\n\t * column visibilities to apply and then setting them.\n\t *\n\t * @param {boolean} forceRedraw Force a redraw\n\t * @private\n\t */\n\t_resize: function (forceRedraw) {\n\t\tvar that = this;\n\t\tvar dt = this.s.dt;\n\t\tvar width = $(window).innerWidth();\n\t\tvar breakpoints = this.c.breakpoints;\n\t\tvar breakpoint = breakpoints[0].name;\n\t\tvar columns = this.s.columns;\n\t\tvar i, ien;\n\t\tvar oldVis = this.s.current.slice();\n\n\t\t// Determine what breakpoint we are currently at\n\t\tfor (i = breakpoints.length - 1; i >= 0; i--) {\n\t\t\tif (width <= breakpoints[i].width) {\n\t\t\t\tbreakpoint = breakpoints[i].name;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t// Show the columns for that break point\n\t\tvar columnsVis = this._columnsVisiblity(breakpoint);\n\t\tthis.s.current = columnsVis;\n\n\t\t// Set the class before the column visibility is changed so event\n\t\t// listeners know what the state is. Need to determine if there are\n\t\t// any columns that are not visible but can be shown\n\t\tvar collapsedClass = false;\n\n\t\tfor (i = 0, ien = columns.length; i < ien; i++) {\n\t\t\tif (\n\t\t\t\tcolumnsVis[i] === false &&\n\t\t\t\t!columns[i].never &&\n\t\t\t\t!columns[i].control &&\n\t\t\t\t!dt.column(i).visible() === false\n\t\t\t) {\n\t\t\t\tcollapsedClass = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t$(dt.table().node()).toggleClass('collapsed', collapsedClass);\n\n\t\tvar changed = false;\n\t\tvar visible = 0;\n\t\tvar dtSettings = dt.settings()[0];\n\t\tvar colGroup = $(dt.table().node()).children('colgroup');\n\t\tvar colEls = dtSettings.aoColumns.map(function (col) {\n\t\t\treturn col.colEl;\n\t\t});\n\n\t\tdt.columns()\n\t\t\t.eq(0)\n\t\t\t.each(function (colIdx, i) {\n\t\t\t\t// Do nothing on DataTables' hidden column - DT removes it from the table\n\t\t\t\t// so we need to slide back\n\t\t\t\tif (! dt.column(colIdx).visible()) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (columnsVis[i] === true) {\n\t\t\t\t\tvisible++;\n\t\t\t\t}\n\n\t\t\t\tif (forceRedraw || columnsVis[i] !== oldVis[i]) {\n\t\t\t\t\tchanged = true;\n\t\t\t\t\tthat._setColumnVis(colIdx, columnsVis[i]);\n\t\t\t\t}\n\n\t\t\t\t// DataTables 2 uses `col` to define the width for a column\n\t\t\t\t// and this needs to run each time, as DataTables will change\n\t\t\t\t// the column width. We may need to reattach if we've removed\n\t\t\t\t// an element previously.\n\t\t\t\tif (! columnsVis[i]) {\n\t\t\t\t\tcolEls[i].detach();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthat._colGroupAttach(colGroup, colEls, i);\n\t\t\t\t}\n\t\t\t});\n\n\t\tif (changed) {\n\t\t\tdt.columns.adjust();\n\n\t\t\tthis._redrawChildren();\n\n\t\t\t// Inform listeners of the change\n\t\t\t$(dt.table().node()).trigger('responsive-resize.dt', [\n\t\t\t\tdt,\n\t\t\t\tthis._responsiveOnlyHidden()\n\t\t\t]);\n\n\t\t\t// If no records, update the \"No records\" display element\n\t\t\tif (dt.page.info().recordsDisplay === 0) {\n\t\t\t\t$('td', dt.table().body()).eq(0).attr('colspan', visible);\n\t\t\t}\n\t\t}\n\n\t\tthat._controlClass();\n\t},\n\n\t/**\n\t * Determine the width of each column in the table so the auto column hiding\n\t * has that information to work with. This method is never going to be 100%\n\t * perfect since column widths can change slightly per page, but without\n\t * seriously compromising performance this is quite effective.\n\t *\n\t * @private\n\t */\n\t_resizeAuto: function () {\n\t\tvar dt = this.s.dt;\n\t\tvar columns = this.s.columns;\n\t\tvar that = this;\n\t\tvar visibleColumns = dt\n\t\t\t.columns()\n\t\t\t.indexes()\n\t\t\t.filter(function (idx) {\n\t\t\t\treturn dt.column(idx).visible();\n\t\t\t});\n\n\t\t// Are we allowed to do auto sizing?\n\t\tif (!this.c.auto) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Are there any columns that actually need auto-sizing, or do they all\n\t\t// have classes defined\n\t\tif (\n\t\t\t$.inArray(\n\t\t\t\ttrue,\n\t\t\t\t$.map(columns, function (c) {\n\t\t\t\t\treturn c.auto;\n\t\t\t\t})\n\t\t\t) === -1\n\t\t) {\n\t\t\treturn;\n\t\t}\n\n\t\t// Clone the table with the current data in it\n\t\tvar clonedTable = dt.table().node().cloneNode(false);\n\t\tvar clonedHeader = $(dt.table().header().cloneNode(false)).appendTo(\n\t\t\tclonedTable\n\t\t);\n\t\tvar clonedFooter = $(dt.table().footer().cloneNode(false)).appendTo(\n\t\t\tclonedTable\n\t\t);\n\t\tvar clonedBody = $(dt.table().body())\n\t\t\t.clone(false, false)\n\t\t\t.empty()\n\t\t\t.appendTo(clonedTable); // use jQuery because of IE8\n\n\t\tclonedTable.style.width = 'auto';\n\n\t\t// Header\n\t\tdt.table()\n\t\t\t.header.structure(visibleColumns)\n\t\t\t.forEach((row) => {\n\t\t\t\tvar cells = row\n\t\t\t\t\t.filter(function (el) {\n\t\t\t\t\t\treturn el ? true : false;\n\t\t\t\t\t})\n\t\t\t\t\t.map(function (el) {\n\t\t\t\t\t\treturn $(el.cell)\n\t\t\t\t\t\t\t.clone(false)\n\t\t\t\t\t\t\t.css('display', 'table-cell')\n\t\t\t\t\t\t\t.css('width', 'auto')\n\t\t\t\t\t\t\t.css('min-width', 0);\n\t\t\t\t\t});\n\n\t\t\t\t$('').append(cells).appendTo(clonedHeader);\n\t\t\t});\n\n\t\t// Always need an empty row that we can read widths from\n\t\tvar emptyRow = $('').appendTo(clonedBody);\n\n\t\tfor (var i = 0; i < visibleColumns.count(); i++) {\n\t\t\temptyRow.append('');\n\t\t}\n\n\t\t// Body rows\n\t\tif (this.c.details.renderer._responsiveMovesNodes) {\n\t\t\t// Slow but it allows for moving elements around the document\n\t\t\tdt.rows({ page: 'current' }).every(function (rowIdx) {\n\t\t\t\tvar node = this.node();\n\n\t\t\t\tif (! node) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// We clone the table's rows and cells to create the sizing table\n\t\t\t\tvar tr = node.cloneNode(false);\n\n\t\t\t\tdt.cells(rowIdx, visibleColumns).every(function (rowIdx2, colIdx) {\n\t\t\t\t\t// If nodes have been moved out (listHiddenNodes), we need to\n\t\t\t\t\t// clone from the store\n\t\t\t\t\tvar store = that.s.childNodeStore[rowIdx + '-' + colIdx];\n\n\t\t\t\t\tif (store) {\n\t\t\t\t\t\t$(this.node().cloneNode(false))\n\t\t\t\t\t\t\t.append($(store).clone())\n\t\t\t\t\t\t\t.appendTo(tr);\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\t$(this.node()).clone(false).appendTo(tr);\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\tclonedBody.append(tr);\n\t\t\t});\n\t\t}\n\t\telse {\n\t\t\t// This is much faster, but it doesn't account for moving nodes around\n\t\t\t$(clonedBody)\n\t\t\t\t.append( $(dt.rows( { page: 'current' } ).nodes()).clone( false ) )\n\t\t\t\t.find( 'th, td' ).css( 'display', '' );\n\t\t}\n\n\t\t// Any cells which were hidden by Responsive in the host table, need to\n\t\t// be visible here for the calculations\n\t\tclonedBody.find('th, td').css('display', '');\n\n\t\t// Footer\n\t\tdt.table()\n\t\t\t.footer.structure(visibleColumns)\n\t\t\t.forEach((row) => {\n\t\t\t\tvar cells = row\n\t\t\t\t\t.filter(function (el) {\n\t\t\t\t\t\treturn el ? true : false;\n\t\t\t\t\t})\n\t\t\t\t\t.map(function (el) {\n\t\t\t\t\t\treturn $(el.cell)\n\t\t\t\t\t\t\t.clone(false)\n\t\t\t\t\t\t\t.css('display', 'table-cell')\n\t\t\t\t\t\t\t.css('width', 'auto')\n\t\t\t\t\t\t\t.css('min-width', 0);\n\t\t\t\t\t});\n\n\t\t\t\t$('').append(cells).appendTo(clonedFooter);\n\t\t\t});\n\n\t\t// In the inline case extra padding is applied to the first column to\n\t\t// give space for the show / hide icon. We need to use this in the\n\t\t// calculation\n\t\tif (this.c.details.type === 'inline') {\n\t\t\t$(clonedTable).addClass('dtr-inline collapsed');\n\t\t}\n\n\t\t// It is unsafe to insert elements with the same name into the DOM\n\t\t// multiple times. For example, cloning and inserting a checked radio\n\t\t// clears the chcecked state of the original radio.\n\t\t$(clonedTable).find('[name]').removeAttr('name');\n\n\t\t// A position absolute table would take the table out of the flow of\n\t\t// our container element, bypassing the height and width (Scroller)\n\t\t$(clonedTable).css('position', 'relative');\n\n\t\tvar inserted = $('
')\n\t\t\t.css({\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1,\n\t\t\t\toverflow: 'hidden',\n\t\t\t\tclear: 'both'\n\t\t\t})\n\t\t\t.append(clonedTable);\n\n\t\tinserted.insertBefore(dt.table().node());\n\n\t\t// The cloned table now contains the smallest that each column can be\n\t\temptyRow.children().each(function (i) {\n\t\t\tvar idx = dt.column.index('fromVisible', i);\n\t\t\tcolumns[idx].minWidth = this.offsetWidth || 0;\n\t\t});\n\n\t\tinserted.remove();\n\t},\n\n\t/**\n\t * Get the state of the current hidden columns - controlled by Responsive only\n\t */\n\t_responsiveOnlyHidden: function () {\n\t\tvar dt = this.s.dt;\n\n\t\treturn $.map(this.s.current, function (v, i) {\n\t\t\t// If the column is hidden by DataTables then it can't be hidden by\n\t\t\t// Responsive!\n\t\t\tif (dt.column(i).visible() === false) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\treturn v;\n\t\t});\n\t},\n\n\t/**\n\t * Set a column's visibility.\n\t *\n\t * We don't use DataTables' column visibility controls in order to ensure\n\t * that column visibility can Responsive can no-exist. Since only IE8+ is\n\t * supported (and all evergreen browsers of course) the control of the\n\t * display attribute works well.\n\t *\n\t * @param {integer} col Column index\n\t * @param {boolean} showHide Show or hide (true or false)\n\t * @private\n\t */\n\t_setColumnVis: function (col, showHide) {\n\t\tvar that = this;\n\t\tvar dt = this.s.dt;\n\t\tvar display = showHide ? '' : 'none'; // empty string will remove the attr\n\n\t\tthis._setHeaderVis(col, showHide, dt.table().header.structure());\n\t\tthis._setHeaderVis(col, showHide, dt.table().footer.structure());\n\n\t\tdt.column(col)\n\t\t\t.nodes()\n\t\t\t.to$()\n\t\t\t.css('display', display)\n\t\t\t.toggleClass('dtr-hidden', !showHide);\n\n\t\t// If the are child nodes stored, we might need to reinsert them\n\t\tif (!$.isEmptyObject(this.s.childNodeStore)) {\n\t\t\tdt.cells(null, col)\n\t\t\t\t.indexes()\n\t\t\t\t.each(function (idx) {\n\t\t\t\t\tthat._childNodesRestore(dt, idx.row, idx.column);\n\t\t\t\t});\n\t\t}\n\t},\n\n\t/**\n\t * Set the a column's visibility, taking into account multiple rows\n\t * in a header / footer and colspan attributes\n\t * @param {*} col\n\t * @param {*} showHide\n\t * @param {*} structure\n\t */\n\t_setHeaderVis: function (col, showHide, structure) {\n\t\tvar that = this;\n\t\tvar display = showHide ? '' : 'none';\n\n\t\tstructure.forEach(function (row) {\n\t\t\tif (row[col]) {\n\t\t\t\t$(row[col].cell)\n\t\t\t\t\t.css('display', display)\n\t\t\t\t\t.toggleClass('dtr-hidden', !showHide);\n\t\t\t}\n\t\t\telse {\n\t\t\t\t// In a colspan - need to rewind calc the new span since\n\t\t\t\t// display:none elements do not count as being spanned over\n\t\t\t\tvar search = col;\n\n\t\t\t\twhile (search >= 0) {\n\t\t\t\t\tif (row[search]) {\n\t\t\t\t\t\trow[search].cell.colSpan = that._colspan(row, search);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\n\t\t\t\t\tsearch--;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t},\n\n\t/**\n\t * How many columns should this cell span\n\t *\n\t * @param {*} row Header structure row\n\t * @param {*} idx The column index of the cell to span\n\t */\n\t_colspan: function (row, idx) {\n\t\tvar colspan = 1;\n\n\t\tfor (var col = idx + 1; col < row.length; col++) {\n\t\t\tif (row[col] === null && this.s.current[col]) {\n\t\t\t\t// colspan and not hidden by Responsive\n\t\t\t\tcolspan++;\n\t\t\t}\n\t\t\telse if (row[col]) {\n\t\t\t\t// Got the next cell, jump out\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\treturn colspan;\n\t},\n\n\t/**\n\t * Update the cell tab indexes for keyboard accessibility. This is called on\n\t * every table draw - that is potentially inefficient, but also the least\n\t * complex option given that column visibility can change on the fly. Its a\n\t * shame user-focus was removed from CSS 3 UI, as it would have solved this\n\t * issue with a single CSS statement.\n\t *\n\t * @private\n\t */\n\t_tabIndexes: function () {\n\t\tvar dt = this.s.dt;\n\t\tvar cells = dt.cells({ page: 'current' }).nodes().to$();\n\t\tvar ctx = dt.settings()[0];\n\t\tvar target = this.c.details.target;\n\n\t\tcells.filter('[data-dtr-keyboard]').removeData('[data-dtr-keyboard]');\n\n\t\tif (typeof target === 'number') {\n\t\t\tdt.cells(null, target, { page: 'current' })\n\t\t\t\t.nodes()\n\t\t\t\t.to$()\n\t\t\t\t.attr('tabIndex', ctx.iTabIndex)\n\t\t\t\t.data('dtr-keyboard', 1);\n\t\t}\n\t\telse {\n\t\t\t// This is a bit of a hack - we need to limit the selected nodes to just\n\t\t\t// those of this table\n\t\t\tif (target === 'td:first-child, th:first-child') {\n\t\t\t\ttarget = '>td:first-child, >th:first-child';\n\t\t\t}\n\n\t\t\t$(target, dt.rows({ page: 'current' }).nodes())\n\t\t\t\t.attr('tabIndex', ctx.iTabIndex)\n\t\t\t\t.data('dtr-keyboard', 1);\n\t\t}\n\t}\n});\n\n/**\n * List of default breakpoints. Each item in the array is an object with two\n * properties:\n *\n * * `name` - the breakpoint name.\n * * `width` - the breakpoint width\n *\n * @name Responsive.breakpoints\n * @static\n */\nResponsive.breakpoints = [\n\t{ name: 'desktop', width: Infinity },\n\t{ name: 'tablet-l', width: 1024 },\n\t{ name: 'tablet-p', width: 768 },\n\t{ name: 'mobile-l', width: 480 },\n\t{ name: 'mobile-p', width: 320 }\n];\n\n/**\n * Display methods - functions which define how the hidden data should be shown\n * in the table.\n *\n * @namespace\n * @name Responsive.defaults\n * @static\n */\nResponsive.display = {\n\tchildRow: function (row, update, render) {\n\t\tvar rowNode = $(row.node());\n\n\t\tif (update) {\n\t\t\tif (rowNode.hasClass('dtr-expanded')) {\n\t\t\t\trow.child(render(), 'child').show();\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tif (!rowNode.hasClass('dtr-expanded')) {\n\t\t\t\tvar rendered = render();\n\n\t\t\t\tif (rendered === false) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\n\t\t\t\trow.child(rendered, 'child').show();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\telse {\n\t\t\t\trow.child(false);\n\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\t},\n\n\tchildRowImmediate: function (row, update, render) {\n\t\tvar rowNode = $(row.node());\n\n\t\tif (\n\t\t\t(!update && rowNode.hasClass('dtr-expanded')) ||\n\t\t\t!row.responsive.hasHidden()\n\t\t) {\n\t\t\t// User interaction and the row is show, or nothing to show\n\t\t\trow.child(false);\n\n\t\t\treturn false;\n\t\t}\n\t\telse {\n\t\t\t// Display\n\t\t\tvar rendered = render();\n\n\t\t\tif (rendered === false) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\trow.child(rendered, 'child').show();\n\n\t\t\treturn true;\n\t\t}\n\t},\n\n\t// This is a wrapper so the modal options for Bootstrap and jQuery UI can\n\t// have options passed into them. This specific one doesn't need to be a\n\t// function but it is for consistency in the `modal` name\n\tmodal: function (options) {\n\t\treturn function (row, update, render, closeCallback) {\n\t\t\tvar modal;\n\t\t\tvar rendered = render();\n\n\t\t\tif (rendered === false) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (!update) {\n\t\t\t\t// Show a modal\n\t\t\t\tvar close = function () {\n\t\t\t\t\tmodal.remove(); // will tidy events for us\n\t\t\t\t\t$(document).off('keypress.dtr');\n\t\t\t\t\t$(row.node()).removeClass('dtr-expanded');\n\n\t\t\t\t\tcloseCallback();\n\t\t\t\t};\n\n\t\t\t\tmodal = $('
')\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$('
')\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t$('
')\n\t\t\t\t\t\t\t\t\t.data('dtr-row-idx', row.index())\n\t\t\t\t\t\t\t\t\t.append(rendered)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t\t$(\n\t\t\t\t\t\t\t\t\t'
×
'\n\t\t\t\t\t\t\t\t).click(function () {\n\t\t\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t\t.append(\n\t\t\t\t\t\t$('
').click(\n\t\t\t\t\t\t\tfunction () {\n\t\t\t\t\t\t\t\tclose();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t\t.appendTo('body');\n\n\t\t\t\t$(row.node()).addClass('dtr-expanded');\n\n\t\t\t\t$(document).on('keyup.dtr', function (e) {\n\t\t\t\t\tif (e.keyCode === 27) {\n\t\t\t\t\t\te.stopPropagation();\n\n\t\t\t\t\t\tclose();\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t\telse {\n\t\t\t\tmodal = $('div.dtr-modal-content');\n\n\t\t\t\tif (modal.length && row.index() === modal.data('dtr-row-idx')) {\n\t\t\t\t\tmodal.empty().append(rendered);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Modal not shown, nothing to update\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (options && options.header) {\n\t\t\t\t$('div.dtr-modal-content').prepend(\n\t\t\t\t\t'

' + options.header(row) + '

'\n\t\t\t\t);\n\t\t\t}\n\n\t\t\treturn true;\n\t\t};\n\t}\n};\n\n/**\n * Display methods - functions which define how the hidden data should be shown\n * in the table.\n *\n * @namespace\n * @name Responsive.defaults\n * @static\n */\nResponsive.renderer = {\n\tlistHiddenNodes: function () {\n\t\tvar fn = function (api, rowIdx, columns) {\n\t\t\tvar that = this;\n\t\t\tvar ul = $(\n\t\t\t\t'
    '\n\t\t\t);\n\t\t\tvar found = false;\n\n\t\t\t$.each(columns, function (i, col) {\n\t\t\t\tif (col.hidden) {\n\t\t\t\t\tvar klass = col.className\n\t\t\t\t\t\t? 'class=\"' + col.className + '\"'\n\t\t\t\t\t\t: '';\n\n\t\t\t\t\t$(\n\t\t\t\t\t\t'
  • ' +\n\t\t\t\t\t\t\t'' +\n\t\t\t\t\t\t\tcol.title +\n\t\t\t\t\t\t\t' ' +\n\t\t\t\t\t\t\t'
  • '\n\t\t\t\t\t)\n\t\t\t\t\t\t.append(\n\t\t\t\t\t\t\t$('').append(\n\t\t\t\t\t\t\t\tthat._childNodes(\n\t\t\t\t\t\t\t\t\tapi,\n\t\t\t\t\t\t\t\t\tcol.rowIndex,\n\t\t\t\t\t\t\t\t\tcol.columnIndex\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t) // api.cell( col.rowIndex, col.columnIndex ).node().childNodes ) )\n\t\t\t\t\t\t.appendTo(ul);\n\n\t\t\t\t\tfound = true;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn found ? ul : false;\n\t\t};\n\n\t\tfn._responsiveMovesNodes = true;\n\n\t\treturn fn;\n\t},\n\n\tlistHidden: function () {\n\t\treturn function (api, rowIdx, columns) {\n\t\t\tvar data = $.map(columns, function (col) {\n\t\t\t\tvar klass = col.className\n\t\t\t\t\t? 'class=\"' + col.className + '\"'\n\t\t\t\t\t: '';\n\n\t\t\t\treturn col.hidden\n\t\t\t\t\t? '
  • ' +\n\t\t\t\t\t\t\t'' +\n\t\t\t\t\t\t\tcol.title +\n\t\t\t\t\t\t\t' ' +\n\t\t\t\t\t\t\t'' +\n\t\t\t\t\t\t\tcol.data +\n\t\t\t\t\t\t\t'' +\n\t\t\t\t\t\t\t'
  • '\n\t\t\t\t\t: '';\n\t\t\t}).join('');\n\n\t\t\treturn data\n\t\t\t\t? $(\n\t\t\t\t\t\t'
      '\n\t\t\t\t).append(data)\n\t\t\t\t: false;\n\t\t};\n\t},\n\n\ttableAll: function (options) {\n\t\toptions = $.extend(\n\t\t\t{\n\t\t\t\ttableClass: ''\n\t\t\t},\n\t\t\toptions\n\t\t);\n\n\t\treturn function (api, rowIdx, columns) {\n\t\t\tvar data = $.map(columns, function (col) {\n\t\t\t\tvar klass = col.className\n\t\t\t\t\t? 'class=\"' + col.className + '\"'\n\t\t\t\t\t: '';\n\n\t\t\t\treturn (\n\t\t\t\t\t'' +\n\t\t\t\t\t'' +\n\t\t\t\t\tcol.title +\n\t\t\t\t\t':' +\n\t\t\t\t\t' ' +\n\t\t\t\t\t'' +\n\t\t\t\t\tcol.data +\n\t\t\t\t\t'' +\n\t\t\t\t\t''\n\t\t\t\t);\n\t\t\t}).join('');\n\n\t\t\treturn $(\n\t\t\t\t''\n\t\t\t).append(data);\n\t\t};\n\t}\n};\n\n/**\n * Responsive default settings for initialisation\n *\n * @namespace\n * @name Responsive.defaults\n * @static\n */\nResponsive.defaults = {\n\t/**\n\t * List of breakpoints for the instance. Note that this means that each\n\t * instance can have its own breakpoints. Additionally, the breakpoints\n\t * cannot be changed once an instance has been creased.\n\t *\n\t * @type {Array}\n\t * @default Takes the value of `Responsive.breakpoints`\n\t */\n\tbreakpoints: Responsive.breakpoints,\n\n\t/**\n\t * Enable / disable auto hiding calculations. It can help to increase\n\t * performance slightly if you disable this option, but all columns would\n\t * need to have breakpoint classes assigned to them\n\t *\n\t * @type {Boolean}\n\t * @default `true`\n\t */\n\tauto: true,\n\n\t/**\n\t * Details control. If given as a string value, the `type` property of the\n\t * default object is set to that value, and the defaults used for the rest\n\t * of the object - this is for ease of implementation.\n\t *\n\t * The object consists of the following properties:\n\t *\n\t * * `display` - A function that is used to show and hide the hidden details\n\t * * `renderer` - function that is called for display of the child row data.\n\t * The default function will show the data from the hidden columns\n\t * * `target` - Used as the selector for what objects to attach the child\n\t * open / close to\n\t * * `type` - `false` to disable the details display, `inline` or `column`\n\t * for the two control types\n\t *\n\t * @type {Object|string}\n\t */\n\tdetails: {\n\t\tdisplay: Responsive.display.childRow,\n\n\t\trenderer: Responsive.renderer.listHidden(),\n\n\t\ttarget: 0,\n\n\t\ttype: 'inline'\n\t},\n\n\t/**\n\t * Orthogonal data request option. This is used to define the data type\n\t * requested when Responsive gets the data to show in the child row.\n\t *\n\t * @type {String}\n\t */\n\torthogonal: 'display'\n};\n\n/*\n * API\n */\nvar Api = $.fn.dataTable.Api;\n\n// Doesn't do anything - work around for a bug in DT... Not documented\nApi.register('responsive()', function () {\n\treturn this;\n});\n\nApi.register('responsive.index()', function (li) {\n\tli = $(li);\n\n\treturn {\n\t\tcolumn: li.data('dtr-index'),\n\t\trow: li.parent().data('dtr-index')\n\t};\n});\n\nApi.register('responsive.rebuild()', function () {\n\treturn this.iterator('table', function (ctx) {\n\t\tif (ctx._responsive) {\n\t\t\tctx._responsive._classLogic();\n\t\t}\n\t});\n});\n\nApi.register('responsive.recalc()', function () {\n\treturn this.iterator('table', function (ctx) {\n\t\tif (ctx._responsive) {\n\t\t\tctx._responsive._resizeAuto();\n\t\t\tctx._responsive._resize();\n\t\t}\n\t});\n});\n\nApi.register('responsive.hasHidden()', function () {\n\tvar ctx = this.context[0];\n\n\treturn ctx._responsive\n\t\t? $.inArray(false, ctx._responsive._responsiveOnlyHidden()) !== -1\n\t\t: false;\n});\n\nApi.registerPlural(\n\t'columns().responsiveHidden()',\n\t'column().responsiveHidden()',\n\tfunction () {\n\t\treturn this.iterator(\n\t\t\t'column',\n\t\t\tfunction (settings, column) {\n\t\t\t\treturn settings._responsive\n\t\t\t\t\t? settings._responsive._responsiveOnlyHidden()[column]\n\t\t\t\t\t: false;\n\t\t\t},\n\t\t\t1\n\t\t);\n\t}\n);\n\n/**\n * Version information\n *\n * @name Responsive.version\n * @static\n */\nResponsive.version = '3.0.3';\n\n$.fn.dataTable.Responsive = Responsive;\n$.fn.DataTable.Responsive = Responsive;\n\n// Attach a listener to the document which listens for DataTables initialisation\n// events so we can automatically initialise\n$(document).on('preInit.dt.dtr', function (e, settings, json) {\n\tif (e.namespace !== 'dt') {\n\t\treturn;\n\t}\n\n\tif (\n\t\t$(settings.nTable).hasClass('responsive') ||\n\t\t$(settings.nTable).hasClass('dt-responsive') ||\n\t\tsettings.oInit.responsive ||\n\t\tDataTable.defaults.responsive\n\t) {\n\t\tvar init = settings.oInit.responsive;\n\n\t\tif (init !== false) {\n\t\t\tnew Responsive(settings, $.isPlainObject(init) ? init : {});\n\t\t}\n\t}\n});\n\n\nexport default DataTable;\n","/*! Bootstrap integration for DataTables' Responsive\n * © SpryMedia Ltd - datatables.net/license\n */\n\nimport jQuery from 'jquery';\nimport DataTable from 'datatables.net-bs';\nimport Responsive from 'datatables.net-responsive';\n\n// Allow reassignment of the $ variable\nlet $ = jQuery;\n\n\nvar _display = DataTable.Responsive.display;\nvar _original = _display.modal;\nvar _modal = $(\n\t'
      ' +\n\t\t'
      ' +\n\t\t'
      ' +\n\t\t'
      ' +\n\t\t'' +\n\t\t'
      ' +\n\t\t'
      ' +\n\t\t'
      ' +\n\t\t'
      ' +\n\t\t'
      '\n);\n\n_display.modal = function (options) {\n\treturn function (row, update, render, closeCallback) {\n\t\tif (!$.fn.modal) {\n\t\t\treturn _original(row, update, render, closeCallback);\n\t\t}\n\t\telse {\n\t\t\tvar rendered = render();\n\n\t\t\tif (rendered === false) {\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\tif (!update) {\n\t\t\t\tif (options && options.header) {\n\t\t\t\t\tvar header = _modal.find('div.modal-header');\n\t\t\t\t\tvar button = header.find('button').detach();\n\n\t\t\t\t\theader\n\t\t\t\t\t\t.empty()\n\t\t\t\t\t\t.append('

      ' + options.header(row) + '

      ')\n\t\t\t\t\t\t.prepend(button);\n\t\t\t\t}\n\n\t\t\t\t_modal.find('div.modal-body').empty().append(rendered);\n\n\t\t\t\t_modal\n\t\t\t\t\t.data('dtr-row-idx', row.index())\n\t\t\t\t\t.one('hidden.bs.modal', closeCallback)\n\t\t\t\t\t.appendTo('body')\n\t\t\t\t\t.modal();\n\t\t\t}\n\t\t\telse {\n\t\t\t\tif ($.contains(document, _modal[0]) && row.index() === _modal.data('dtr-row-idx')) {\n\t\t\t\t\t_modal.find('div.modal-body').empty().append(rendered);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\t// Modal not shown - do nothing\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t};\n};\n\n\nexport default DataTable;\n"],"names":["PublicMainVM","_MainView","_this","_classCallCheck","tabs","ko","selectedTab","_inherits","key","get","this","_user","set","user","_superPropSet","privileges","value","tab","currentSelectedTab","push","selectTab","bind","url","window","location","href","pos","toLowerCase","indexOf","baseUrl","substring","history","pushState","concat","_context","prev","next","reload","t0","showError","stop","_callee","MainView","PublicationDetail","model","onChange","mainView","userManager","viewModelFactory","repo","remote","title","year","type","authors","journal","cite","description","doi","materials","instruments","link","dataLink","_repo","_viewModelFactory","_mainView","_remote","_onChange","setModelData","canEdit","isAuthorized","Privilege","Publication","Operation","Update","canHide","Delete","filter","m","externalId","map","MaterialVM","hasData","createRelativeUrl","_a","id","_toConsumableArray","synthesisInstruments","characterizationInstruments","i","name","hasDoi","_model","openPublicationEditor","modified","sent","openPopup","QuestionPopup","_context2","status","Status","Deleted","_callee2","ViewModelFactory","publicationRepo","projectRepo","materialRepo","masterData","_publicationRepo","_materialRepo","_projectRepo","_masterData","_userManager","viewModel","PublicationVM","createMaterial","initViewModel","initWithModel","abrupt","material","MaterialPopup","ApplicationError","undefined","owner","Error","PublicationMasterData","charInstrumentRepo","charTechniqueRepo","selectListRepo","synInstrumentRepo","synTechniqueRepo","_selectLists","SelectListMap","_charInstrumentRepo","_charTechniqueRepo","_selectListRepo","_synInstrumentRepo","_synTechniqueRepo","_scienceDrivers","_journals","_charInstruments","_synInstruments","techniqueIds","_sampleSynTechniques","_characterizationTechniques","_materialsRegistry","substrates","listName","list","entry","find","c","getJournals","promises","getScienceDrivers","then","r","loadAll","_setSynthesisTechniques","MaterialsRegistry","load","result","SelectList","PublicationType","publicationType","Promise","all","techniques","_ref","groups","t","subTechniques","length","ungrouped","parentTechnique","apply","g","sort","s1","s2","localeCompare","s","addNewSubstrate","addMaterial","getMaterialById","ids","getMaterialNames","PublicationTable","materialSearch","viewmodelFactory","loadFunction","_materialSearch","scienceDrivers","_publicationTypes","getSelectList","_loadFunction","_table","one","columns","adjust","draw","elem","table","resolve","setTimeout","first","settings","ajax","data","callback","_this2","lengthChange","className","orderable","defaultContent","render","row","_renderJournalColumn","searchable","_renderMaterialColumn","_renderTypeColumn","_renderScienceDriverColumn","visible","order","layout","topEnd","search","placeholder","language","createdRow","dataIndex","$","attr","searching","serverSide","responsive","DataTable","that","toggleDetail","_toggleDetail","on","tr","closest","icon","_this3","projects","p","_getProjectRef","accessibleProjects","join","typeLabel","_b","project","some","a","projectLabel","_this4","values","short","v","long","label","_this5","joined","vm","getMaterial","_this6","child","isShown","hide","removeClass","detail","getPublicationDetail","_updateRow","templateName","show","addClass","updated","Submitted","rows","index","remove","updateJournals","PublicationTab","_Tab","materialFilter","_callSuper","elements","materialIds","materialsDesc","scienceDriver","searchText","allScienceDrivers","allTypes","showCreateButton","_initPromise","_initialized","currentRow","_loadData","_materialFilter","tableVisible","subscribe","Create","setupTable","init","ReferencedMaterials","_context3","filtered","e","selection","_callee3","sortIndex","column","_context4","criteria","getSearchParams","_c","dir","start","dataPackages","finish","_callee4","publication","_context5","apiAccess","add","currentOrder","newOrder","_callee5","Tab","SampleStatTab","mainData","sampleStatRepo","synTechnique","charTechnique","_sampleStatRepo","allSynTechniques","sampleSynthesisTechniques","allCharTechniques","characterizationTechniques","clear","getStats","sampleStat","showData","Sample","includeFinalized","includeSplitPieces","shipped","ShippingFilter","Any","techniqueId","withCharacterization","SampleStatisticsRepository","_BaseControllerReposi","remotePostAny","BaseControllerRepository","SampleStatTable","_charTechniques","_renderContactColumn","forEach","_renderStats","characterizations","count","fullName","getFullNames","CompositionRoot","RemoteServer","CharacterizationInstrumentRepository","CharacterizationTechniqueRepository","collaboratorRepo","CollaboratorRepository","MaterialRepository","ProjectRepository","PublicationRepository","SynthesisInstrumentRepository","SynthesisTechniqueRepository","SelectListRepository","materialsVM","MaterialMap","elementsVM","ElementsMap","SearchByMaterial","signInAsPopup","SignInAsPopup","UserManager","PublicMasterData","setInitialized","runEarly","initialTabName","getInitialTab","SampleStatistics","isAnonymous","newUrl","getForwardUrlWithLogin","publicationTab","addTab","sampleStatTable","sampleStatTab","alert","pathname","endsWith","getQueryVariable","deferUpdates","decorateInputElement","errorClass","errorElementClass","grouping","deep","live","observable","messagesOnModified","initKoExtensions","initSelect2","initSummerNote","initLogging","initDatePicker","document","tooltip","html","container","placement","element","$element","elementTop","offset","top","elementBottom","outerHeight","viewportTop","scrollTop","height","setUpApplication","addEventListener","isDirty","returnValue","preventDefault","error","Role","_substrates","_materials","b","_materialMap","Material","createMap","Substrate","substrateRepo","_yield$Promise$all","_yield$Promise$all2","_slicedToArray","Array","isArray","ArrayComparer","every","item","includes","deserializeDateTime","param","Date","formatDate","date","format","arguments","DateFormat","dateOnly","formatter","formatString","_createClass","Intl","DateTimeFormat","month","day","dateTime","hour","hour12","minute","DownloadHelper","filename","blob","Blob","createElement","URL","createObjectURL","download","click","SynthesisInstrumentHelper","allInstruments","allTechniques","_techniqueIds$map","searchTechniques","synthesisTechniques","instrumentTechnique","st","RequestStatus","ProjectSearchStatus","DataPackageType","Visibility","ActivityCategory","ActivityType","ProjectType","CharacterizationMetaDataSource","Lookup","Technique","ProjectStatus","SampleImportStatus","CharacterizationUploadStatus","FileImportStatus","AutoSubmitStatus","SampleReportingCategory","ProcessDevelopment","_calculatedLabel","_createLabel","vendor","lot","purity","granularity","orientation","usage","_Error","action","message","RemoteError","code","details","StatusCode","UnprocessableEntity","FailedDependency","PreconditionRequired","ServerError","open","body","innerHTML","log","stack","_wrapNativeSuper","components","isSubstrate","isConfidential","aliases","parsed","updateComponents","form","used","n","substrate","array","Map","alias","parts","split","test","ColumnType","MetadataSource","MipMachine","ProjectCategory","SampleRequestStatus","ReportAttribute","ReportObject","ReportAggregation","_entries","apiVersion","controller","_apiVersion","_controller","params","_getUrl","ExpectedReturnType","TEXT","getArray","post","_context6","_callee6","action_1","_regeneratorRuntime","mark","_callee7","wrap","_context7","_callee8","_context8","put","_context9","_callee9","_context10","_callee10","patch","_context11","_callee11","_context12","_callee12","downloadViaPost","downloadViaGet","_context13","_callee13","Object","keys","toString","loadDefaultConfig","remoteGetArray","entity","remotePost","remotePut","remoteDelete","remoteGetAny","technique","remoteGet","roleId","userId","customizing","remotePutAny","_context14","_callee14","_context15","_callee15","_context16","_callee16","_context17","_callee17","referencedBy","All","includeUsage","loaded","sortColumn","sortOrder","remotePatch","remoteDeleteVersion","projectId","op","noteId","days","includeShipped","nbOfDays","recent","_context18","_callee18","_context19","_callee19","_context20","_callee20","_context21","_callee21","_context22","_callee22","_context23","_callee23","_context24","_callee24","requestId","_context25","_callee25","_context26","_callee26","label_1","alwaysAddNumber","_callee27","_context27","remoteGetString","_context28","_callee28","_context29","_callee29","contactName","_context30","_callee30","id_1","_callee31","_context31","publicationId","request","lists","l","technique_1","exclude","instrument","statusText","HttpMethod","templatesToLoadOnInit","_pathBase","BASE_URL","_publicServerName","PUBLIC_SERVER_NAME","_antiForgeryToken","TOKEN_HEADER_VALUE","_deployId","DEPLOY_ID","_devServerUrl","DEV_SERVER_URL","loader","loadAtInit","EMPTY_TEMPLATE","getTemplateId","replace","appendTemplate","scriptTag","head","getElementsByTagName","appendChild","getTemplate","templateId","getElementById","__awaiter","_loadTemplate","valueAccessor","obj","template","update","allBindings","bindingContext","allowedBindings","lazyTemplate","ERROR_POPUP_TEMPLATE","base","origin","fetch","method","GET","response","ok","t1","t2","text","t3","t4","RequestVerificationToken","variable","_step","_iterator","_createForOfIteratorHelper","done","pair","decodeURIComponent","err","f","createRelativeDataUrl","createAbsoluteDataUrl","_getFullPath","_fetch","POST","PUT","DELETE","PATCH","url_1","expectedContent","JSON","_download","path","method_1","data_1","jsonData","headers","stringify","assign","getAntiForgeryHeader","Accept","_getAcceptHeader","json","HTML","htmlBody","reject","contentType","xhrFields","responseType","xhr","disposition","getResponseHeader","matches","exec","fail","responseText","RoleSelectionPopup","roles","_onClose","signinAsPopup","_signinAsPopup","signInAs","stopSignInAs","switchRole","_currentUser","isFaculty","isResearcher","isInhouse","loadStaff","checkCanCreateAnySample","staff","canCreateSamples","canAccessUnpublishedData","actualRole","getCurrent","getStaff","existsProjectWith","ProcessingActivity","AccessUnpublishedData","Read","_canSwitchRoles","canSwitchRoles","selectedRole","roleIds","_requestUserRole","_privileges","_researchers","lastName","_faculty","_staff","_users","_canCreateSamples","_canAccessUnpublishedData","u","UseAnySynthesisTechnique","_userTechniques","_userInstruments","getInstrumentsByTechnique","currentUser","eppn","login","isUsingSignInAs","SignInAs","usingSignInAs","Bulk","slice","getAllResearchers","getAllFaculty","SynthesisInstrument","SynthesisTechnique","CharacterizationInstrument","CharacterizationTechnique","ResearchGroup","BulkRawMaterial","User","collaborator","privilege","askUserIfContinue","getRoles","popup","selectRole","allPrivilege","rights","extract","content","regexForDelimiter","RegExp","delimMatch","match","startDelim","endDelim","regex","extractNumber","extracted","parseInt","isRisCitation","formatDoi","convertToNumber","isString","NewPublication","_sanitizerConfig","allowedTags","_onSave","createRequest","sanitize","isBibTexFormat","volume","issue","pages","extractVolumeInfo","authorstring","str","lastcommafirst","initials","charAt","toUpperCase","names","formatAuthor","scienceDriverIds","projectIds","parseBibTex","cslJson","parseRis","cslData","author","given","family","raw","extractYear","issued","number","page1","page","last","formatVolumeInfo","DOI","parseCitation","begin","end","remainder","trim","startsWith","parse2dccCitation","_convertToPublication","_","event","stopPropagation","style","backgroundColor","dropArea","files","originalEvent","dataTransfer","file","readFile","reader","FileReader","onload","target","onerror","console","readAsText","lastChangedByUser","lastChangedDate","New","_DataObject","onCreateMaterial","mainScienceDriver","otherScienceDrivers","synthesisInstrumentIds","characterizationInstrumentIds","allMaterials","allSynthesisInstruments","allCharacterizationInstruments","allJournals","hasModifications","submitValidation","newProject","selectedProjectIds","canCreateMaterial","_isNew","_isDirty","statusToolTip","saveSuspended","_owner","isSubmitted","isPending","readonly","_onCreateMaterial","createAbsoluteUrl","_dataPackages","_super","call","journals","requirePrivilege","userCanDelete","userCanReset","userCanSubmit","mainScienceDriverText","otherScienceDriversText","equalityComparer","_doiLink","_configureValidation","saveWork","_save","setChangeTrigger","errors","showAllMessages","isValid","NotFound","newMaterial","isLoading","getDataPackages","models","getDataPackage","j","_modified","field","newValue","abstract","extend","displayName","required","max","min","showWorkingMask","create","getModel","saved","isNew","DataObject","BaseViewModel","initialValidation","configureInitialValidation","configureSubmitValidation","_BaseViewModel","lastChangedDateText","isUploading","userCanUpdate","getUploadingStatusText","Pending","isPublished","Published","canUpdate","isStatusReadonly","canDelete","canSubmit","canReset","main","dataObject","Submit","ResetToPending","handler","constructor","getId","InfoPopup","close","showPopup","currentPopup","popupTemplate","errorPopupTemplate","currentErrorPopup","showErrorPopup","initialized","question","explanation","openErrorPopup","formerActivePopup","showInPopup","getBaseAppUrl","ErrorPopup","operation_1","operation","withWorkingMask","isSelected","_currentSelectedTab","_title","selected","materialProvider","_materialList","_typeof","labelGenerator","_initValidation","_callback","_doCreate","_addNewMaterial","ValidationPopup","createPopup","findIndex","val","validation","validator","_existsMaterial","elems","_ret","_loop","comp","Element","clicked","disabled","left","_array","_step2","_iterator2","_step3","_iterator3","hidden","_step4","_iterator4","component","MaterialFilterVM","active","ref","materialVM","resetDisabled","resetElementFilter","filterByElement","filterByMaterial","_updateMaterialList","_onSelectionChanged","isDisabled","getSelectedMaterials","lookup","ref_1","activeIds","loadAsync","filterByMaterials","getSelectedElements","_getSelectionDesc","htmlInPopup","errorHandler","userRepo","users","_errorHandler","_userRepo","_updateRoles","getUsers","Set","from","c1","c2","items","obs","_checkComposed","composed","prototype","hasOwnProperty","property","_checkValidatedObservable","_addError","unwrapped","nameProp","extractField","record","propName","fields","getValue","fn","insertAt","valueWillMutate","splice","valueHasMutated","options","rules","moment","minLength","insertValidationMessage","parentElement","hasClass","booleanValue","interceptor","read","write","modal","backdrop","autoclose","keyboard","unwrapObservable","sortable","el","asc","css","prop","arr","right","rec1","rec2","props","parenIndex","uploader","allBindingsAccessor","onSucess","onFailure","autoUpload","callbacks","onComplete","fileName","responseJSON","success","parse","recipe","removeFileRef","getItemByFileId","onUpload","beforeUpload","onError","errorReason","forceMultipart","FineUploader","floating","after","toggleClass","parents","HTMLInputElement","trigger","copyToClipboard","clipboardData","setData","queryCommandSupported","textarea","textContent","position","select","execCommand","ex","prompt","removeChild","scrollTo","scrollIntoView","updateDatePicker","kodate","datepicker","updateObservableFromDatePicker","newDate","isNaN","getTime","oldDate","optionsvalue","datepickerOptions","assumeNearbyYear","daysOfWeekHighlighted","enableOnReadonly","todayHighlight","registerEventHandler","select2query","prefixPreferredSorter","searchString","term","aStr","bStr","aStartWithSearch","dataChangeHandler","$el","subscription","ignoreChange","binding","originalEqualityComparer","isObservable","triggerChangeQuietly","_target","selectedOptions","addTrigger","select2","theme","width","tags","selectOnClose","dropdownParent","modalParent","matchStart","sorter","extendOptions","select2Elem","$selection","evt","searchInput","$dropdown","focus","domNodeDisposal","addDisposeCallback","off","dispose","_len","args","_key","createSummerNotePopOver","optionsBinding","airToolbarMenu","allowHeading","air","image","createSummerNoteToolbar","toolbarMenu","noToolbar","allowImage","allowTable","insertMenu","richtext","richtextOptions","popover","toolbar","updateObservable","summernote","onBlur","onPaste","isCtrl","which","INFO","DEBUG","TRACE","webpackContext","req","webpackContextResolve","__webpack_require__","o","module","exports","Responsive","opts","versionCheck","childNodeStore","current","dt","Api","defaults","_constructor","oldWindowWidth","innerWidth","_responsive","util","throttle","_resize","idx","inArray","each","cells","nodes","to$","node","_setColumnVis","breakpoints","_classLogic","_detailsInit","_timer","clearTimeout","_resizeAuto","_redrawChildren","d","curr","rowIds","_detailsDisplay","_controlClass","ready","_colGroupAttach","colGroup","colEls","found","parentNode","insertBefore","append","_childNodes","col","children","cell","childNodes","ien","_childNodesRestore","store","parentChildren","jen","_columnsVisiblity","breakpoint","columnIdx","priority","display","auto","minWidth","includeIn","requiredWidth","scrolling","oScroll","bar","sY","sX","iBarWidth","usedWidth","offsetWidth","control","empty","colIdx","showControl","never","eq","header","responsivePriority","dataPriority","getAttribute","operator","matched","size","_find","classNames","k","ken","brokenPoint","re","columnsVis","firstVisible","res","triggerHandler","renderer","_detailsObj","_tabIndexes","keyCode","selector","toArray","targetIdx","rowIdx","aoColumns","sClass","columnIndex","orthogonal","rowIndex","iterator","forceRedraw","oldVis","collapsedClass","changed","dtSettings","colEl","detach","_responsiveOnlyHidden","info","recordsDisplay","visibleColumns","indexes","clonedTable","cloneNode","clonedHeader","appendTo","clonedFooter","footer","clonedBody","clone","structure","emptyRow","_responsiveMovesNodes","rowIdx2","removeAttr","inserted","overflow","showHide","_setHeaderVis","isEmptyObject","colSpan","_colspan","colspan","ctx","removeData","iTabIndex","Infinity","childRow","rowNode","rendered","childRowImmediate","hasHidden","closeCallback","prepend","listHiddenNodes","api","ul","klass","listHidden","tableAll","tableClass","dataTable","register","li","parent","context","registerPlural","version","namespace","nTable","oInit","isPlainObject","_display","_original","_modal","contains","button"],"sourceRoot":""}