@alfresco/adf-content-services
Version:
Alfresco ADF content services
109 lines • 16.9 kB
JavaScript
/*!
* @license
* Copyright © 2005-2025 Hyland Software, Inc. and its affiliates. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { AppConfigService } from '@alfresco/adf-core';
import { CommonModule } from '@angular/common';
import { Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core';
import { MatFormFieldModule } from '@angular/material/form-field';
import { MatInputModule } from '@angular/material/input';
import { TranslateModule } from '@ngx-translate/core';
import * as i0 from "@angular/core";
import * as i1 from "@alfresco/adf-core";
import * as i2 from "@angular/common";
import * as i3 from "@angular/material/form-field";
import * as i4 from "@angular/material/input";
import * as i5 from "@ngx-translate/core";
export class SearchInputComponent {
constructor(appConfig) {
this.appConfig = appConfig;
this.value = '';
this.label = 'SEARCH.INPUT.LABEL';
this.placeholder = 'SEARCH.INPUT.PLACEHOLDER';
this.fields = ['cm:name'];
this.changed = new EventEmitter();
}
ngOnInit() {
const searchConfig = this.appConfig.get('search') || {};
if (searchConfig['app:fields']) {
this.fields = searchConfig['app:fields'];
}
}
onSearchInputChanged(event) {
const input = event.target;
const searchTerm = input.value;
const query = this.formatSearchQuery(searchTerm, this.fields);
if (query) {
this.changed.emit(decodeURIComponent(query));
}
}
formatSearchQuery(userInput, fields = ['cm:name']) {
if (!userInput) {
return null;
}
if (/^https?:\/\//.test(userInput)) {
return this.formatFields(fields, userInput);
}
userInput = userInput.trim();
if (userInput.includes(':') || userInput.includes('"')) {
return userInput;
}
const words = userInput.split(' ');
if (words.length > 1) {
const separator = words.some(this.isOperator) ? ' ' : ' AND ';
return words.map((term) => (this.isOperator(term) ? term : this.formatFields(fields, term))).join(separator);
}
return this.formatFields(fields, userInput);
}
isOperator(input) {
if (input) {
input = input.trim().toUpperCase();
const operators = ['AND', 'OR'];
return operators.includes(input);
}
return false;
}
formatFields(fields, term) {
let prefix = '';
let suffix = '*';
if (term.startsWith('=')) {
prefix = '=';
suffix = '';
term = term.substring(1);
}
if (term === '*') {
prefix = '';
suffix = '';
}
return '(' + fields.map((field) => `${prefix}${field}:"${term}${suffix}"`).join(' OR ') + ')';
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SearchInputComponent, deps: [{ token: i1.AppConfigService }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.3", type: SearchInputComponent, isStandalone: true, selector: "adf-search-input", inputs: { value: "value", label: "label", placeholder: "placeholder", fields: "fields" }, outputs: { changed: "changed" }, ngImport: i0, template: "<div class=\"adf-search-input-container\">\n <mat-form-field appearance=\"outline\">\n <mat-label *ngIf=\"label\">{{ label | translate }}</mat-label>\n <input matInput [placeholder]=\"placeholder | translate\" [value]=\"value\" (change)=\"onSearchInputChanged($event)\" />\n </mat-form-field>\n</div>\n", styles: [".adf-search-input-container{margin:10px}.adf-search-input-container mat-form-field{width:100%}.adf-search-input-container mat-form-field .mat-form-field-wrapper{padding:0}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i3.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i3.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i4.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.3", ngImport: i0, type: SearchInputComponent, decorators: [{
type: Component,
args: [{ selector: 'adf-search-input', standalone: true, imports: [CommonModule, MatFormFieldModule, MatInputModule, TranslateModule], encapsulation: ViewEncapsulation.None, template: "<div class=\"adf-search-input-container\">\n <mat-form-field appearance=\"outline\">\n <mat-label *ngIf=\"label\">{{ label | translate }}</mat-label>\n <input matInput [placeholder]=\"placeholder | translate\" [value]=\"value\" (change)=\"onSearchInputChanged($event)\" />\n </mat-form-field>\n</div>\n", styles: [".adf-search-input-container{margin:10px}.adf-search-input-container mat-form-field{width:100%}.adf-search-input-container mat-form-field .mat-form-field-wrapper{padding:0}\n"] }]
}], ctorParameters: () => [{ type: i1.AppConfigService }], propDecorators: { value: [{
type: Input
}], label: [{
type: Input
}], placeholder: [{
type: Input
}], fields: [{
type: Input
}], changed: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLWlucHV0LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYi9jb250ZW50LXNlcnZpY2VzL3NyYy9saWIvc2VhcmNoL2NvbXBvbmVudHMvc2VhcmNoLWlucHV0L3NlYXJjaC1pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWIvY29udGVudC1zZXJ2aWNlcy9zcmMvbGliL3NlYXJjaC9jb21wb25lbnRzL3NlYXJjaC1pbnB1dC9zZWFyY2gtaW5wdXQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxNQUFNLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7Ozs7OztBQVd0RCxNQUFNLE9BQU8sb0JBQW9CO0lBZ0I3QixZQUFvQixTQUEyQjtRQUEzQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQWQvQyxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBR1gsVUFBSyxHQUFHLG9CQUFvQixDQUFDO1FBRzdCLGdCQUFXLEdBQUcsMEJBQTBCLENBQUM7UUFHekMsV0FBTSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFHckIsWUFBTyxHQUFHLElBQUksWUFBWSxFQUFVLENBQUM7SUFFYSxDQUFDO0lBRW5ELFFBQVE7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O1lBQ1osSUFBSSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELElBQUksSUFBSSxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ2YsTUFBTSxHQUFHLEVBQUUsQ0FBQztZQUNaLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFDaEIsQ0FBQztRQUVELE9BQU8sR0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEdBQUcsTUFBTSxHQUFHLEtBQUssS0FBSyxJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDO0lBQ2xHLENBQUM7OEdBdEZRLG9CQUFvQjtrR0FBcEIsb0JBQW9CLHVNQ2pDakMsb1VBTUEsc09Ec0JjLFlBQVksa0lBQUUsa0JBQWtCLDBTQUFFLGNBQWMsMFdBQUUsZUFBZTs7MkZBS2xFLG9CQUFvQjtrQkFSaEMsU0FBUzsrQkFDSSxrQkFBa0IsY0FDaEIsSUFBSSxXQUNQLENBQUMsWUFBWSxFQUFFLGtCQUFrQixFQUFFLGNBQWMsRUFBRSxlQUFlLENBQUMsaUJBRzdELGlCQUFpQixDQUFDLElBQUk7cUZBSXJDLEtBQUs7c0JBREosS0FBSztnQkFJTixLQUFLO3NCQURKLEtBQUs7Z0JBSU4sV0FBVztzQkFEVixLQUFLO2dCQUlOLE1BQU07c0JBREwsS0FBSztnQkFJTixPQUFPO3NCQUROLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKiFcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgwqkgMjAwNS0yMDI1IEh5bGFuZCBTb2Z0d2FyZSwgSW5jLiBhbmQgaXRzIGFmZmlsaWF0ZXMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICovXG5cbmltcG9ydCB7IEFwcENvbmZpZ1NlcnZpY2UgfSBmcm9tICdAYWxmcmVzY28vYWRmLWNvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IENvbXBvbmVudCwgRXZlbnRFbWl0dGVyLCBJbnB1dCwgT25Jbml0LCBPdXRwdXQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkJztcbmltcG9ydCB7IE1hdElucHV0TW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaW5wdXQnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBTZWFyY2hDb25maWd1cmF0aW9uIH0gZnJvbSAnLi4vLi4vbW9kZWxzJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdhZGYtc2VhcmNoLWlucHV0JyxcbiAgICBzdGFuZGFsb25lOiB0cnVlLFxuICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEZvcm1GaWVsZE1vZHVsZSwgTWF0SW5wdXRNb2R1bGUsIFRyYW5zbGF0ZU1vZHVsZV0sXG4gICAgdGVtcGxhdGVVcmw6IGAuL3NlYXJjaC1pbnB1dC5jb21wb25lbnQuaHRtbGAsXG4gICAgc3R5bGVVcmxzOiBbJy4vc2VhcmNoLWlucHV0LmNvbXBvbmVudC5zY3NzJ10sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxufSlcbmV4cG9ydCBjbGFzcyBTZWFyY2hJbnB1dENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgQElucHV0KClcbiAgICB2YWx1ZSA9ICcnO1xuXG4gICAgQElucHV0KClcbiAgICBsYWJlbCA9ICdTRUFSQ0guSU5QVVQuTEFCRUwnO1xuXG4gICAgQElucHV0KClcbiAgICBwbGFjZWhvbGRlciA9ICdTRUFSQ0guSU5QVVQuUExBQ0VIT0xERVInO1xuXG4gICAgQElucHV0KClcbiAgICBmaWVsZHMgPSBbJ2NtOm5hbWUnXTtcblxuICAgIEBPdXRwdXQoKVxuICAgIGNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBwQ29uZmlnOiBBcHBDb25maWdTZXJ2aWNlKSB7fVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHNlYXJjaENvbmZpZyA9IHRoaXMuYXBwQ29uZmlnLmdldDxTZWFyY2hDb25maWd1cmF0aW9uPignc2VhcmNoJykgfHwge307XG4gICAgICAgIGlmIChzZWFyY2hDb25maWdbJ2FwcDpmaWVsZHMnXSkge1xuICAgICAgICAgICAgdGhpcy5maWVsZHMgPSBzZWFyY2hDb25maWdbJ2FwcDpmaWVsZHMnXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uU2VhcmNoSW5wdXRDaGFuZ2VkKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgICAgICBjb25zdCBzZWFyY2hUZXJtID0gaW5wdXQudmFsdWU7XG5cbiAgICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmZvcm1hdFNlYXJjaFF1ZXJ5KHNlYXJjaFRlcm0sIHRoaXMuZmllbGRzKTtcbiAgICAgICAgaWYgKHF1ZXJ5KSB7XG4gICAgICAgICAgICB0aGlzLmNoYW5nZWQuZW1pdChkZWNvZGVVUklDb21wb25lbnQocXVlcnkpKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0U2VhcmNoUXVlcnkodXNlcklucHV0OiBzdHJpbmcsIGZpZWxkcyA9IFsnY206bmFtZSddKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCF1c2VySW5wdXQpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKC9eaHR0cHM/OlxcL1xcLy8udGVzdCh1c2VySW5wdXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtYXRGaWVsZHMoZmllbGRzLCB1c2VySW5wdXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgdXNlcklucHV0ID0gdXNlcklucHV0LnRyaW0oKTtcblxuICAgICAgICBpZiAodXNlcklucHV0LmluY2x1ZGVzKCc6JykgfHwgdXNlcklucHV0LmluY2x1ZGVzKCdcIicpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXNlcklucHV0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3Qgd29yZHMgPSB1c2VySW5wdXQuc3BsaXQoJyAnKTtcblxuICAgICAgICBpZiAod29yZHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gd29yZHMuc29tZSh0aGlzLmlzT3BlcmF0b3IpID8gJyAnIDogJyBBTkQgJztcbiAgICAgICAgICAgIHJldHVybiB3b3Jkcy5tYXAoKHRlcm0pID0+ICh0aGlzLmlzT3BlcmF0b3IodGVybSkgPyB0ZXJtIDogdGhpcy5mb3JtYXRGaWVsZHMoZmllbGRzLCB0ZXJtKSkpLmpvaW4oc2VwYXJhdG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdEZpZWxkcyhmaWVsZHMsIHVzZXJJbnB1dCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc09wZXJhdG9yKGlucHV0OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKGlucHV0KSB7XG4gICAgICAgICAgICBpbnB1dCA9IGlucHV0LnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xuXG4gICAgICAgICAgICBjb25zdCBvcGVyYXRvcnMgPSBbJ0FORCcsICdPUiddO1xuICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9ycy5pbmNsdWRlcyhpbnB1dCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgZm9ybWF0RmllbGRzKGZpZWxkczogc3RyaW5nW10sIHRlcm06IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCBwcmVmaXggPSAnJztcbiAgICAgICAgbGV0IHN1ZmZpeCA9ICcqJztcblxuICAgICAgICBpZiAodGVybS5zdGFydHNXaXRoKCc9JykpIHtcbiAgICAgICAgICAgIHByZWZpeCA9ICc9JztcbiAgICAgICAgICAgIHN1ZmZpeCA9ICcnO1xuICAgICAgICAgICAgdGVybSA9IHRlcm0uc3Vic3RyaW5nKDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRlcm0gPT09ICcqJykge1xuICAgICAgICAgICAgcHJlZml4ID0gJyc7XG4gICAgICAgICAgICBzdWZmaXggPSAnJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAnKCcgKyBmaWVsZHMubWFwKChmaWVsZCkgPT4gYCR7cHJlZml4fSR7ZmllbGR9OlwiJHt0ZXJtfSR7c3VmZml4fVwiYCkuam9pbignIE9SICcpICsgJyknO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJhZGYtc2VhcmNoLWlucHV0LWNvbnRhaW5lclwiPlxuICAgIDxtYXQtZm9ybS1maWVsZCBhcHBlYXJhbmNlPVwib3V0bGluZVwiPlxuICAgICAgICA8bWF0LWxhYmVsICpuZ0lmPVwibGFiZWxcIj57eyBsYWJlbCB8IHRyYW5zbGF0ZSB9fTwvbWF0LWxhYmVsPlxuICAgICAgICA8aW5wdXQgbWF0SW5wdXQgW3BsYWNlaG9sZGVyXT1cInBsYWNlaG9sZGVyIHwgdHJhbnNsYXRlXCIgW3ZhbHVlXT1cInZhbHVlXCIgKGNoYW5nZSk9XCJvblNlYXJjaElucHV0Q2hhbmdlZCgkZXZlbnQpXCIgLz5cbiAgICA8L21hdC1mb3JtLWZpZWxkPlxuPC9kaXY+XG4iXX0=