diff --git a/api/js/etemplate/Et2Date/Et2Date.ts b/api/js/etemplate/Et2Date/Et2Date.ts index 0d5c94efcb..726360533d 100644 --- a/api/js/etemplate/Et2Date/Et2Date.ts +++ b/api/js/etemplate/Et2Date/Et2Date.ts @@ -390,7 +390,7 @@ export class Et2Date extends Et2InputWidget(FormControlMixin(ValidateMixin(LitFl * @see https://flatpickr.js.org/options/ * @returns {any} */ - getOptions() + protected getOptions() { let options = super.getOptions(); diff --git a/api/js/etemplate/Et2Date/Et2DateRange.ts b/api/js/etemplate/Et2Date/Et2DateRange.ts deleted file mode 100644 index ae928b7ab8..0000000000 --- a/api/js/etemplate/Et2Date/Et2DateRange.ts +++ /dev/null @@ -1,356 +0,0 @@ -import {Et2InputWidget} from "../Et2InputWidget/Et2InputWidget"; -import {dateStyles} from "./DateStyles"; -import {css, html, LitElement, repeat, TemplateResult} from "@lion/core"; -import {egw} from "../../jsapi/egw_global"; -import {Et2Select} from "../Et2Select/Et2Select"; -import {Et2widgetWithSelectMixin} from "../Et2Select/Et2WidgetWithSelectMixin"; -import {SelectOption} from "../Et2Select/FindSelectOptions"; -import "flatpickr/dist/plugins/rangePlugin.js"; -import {Et2Date} from "./Et2Date"; - -export class Et2DateRange extends Et2widgetWithSelectMixin(Et2InputWidget(LitElement)) -{ - static get styles() - { - return [ - ...super.styles, - dateStyles, - css` - :host { - width: auto; - } - `, - ]; - } - - static get properties() - { - return { - ...super.properties, - /** - * An object with keys 'from' and 'to' for absolute ranges, or a relative range string - */ - value: {type: Object}, - /** - * Is the date range relative (this week) or absolute (2016-02-15 - 2016-02-21). This will affect the value returned. - */ - relative: {type: Boolean}, - - placeholder: {type: String} - } - } - - // Class Constants - static readonly relative_dates = [ - // Start and end are relative offsets, see et2_date.set_min() - // or Date objects - { - value: 'Today', - label: 'Today', - from(date) {return date;}, - to(date) {return date;} - }, - { - label: 'Yesterday', - value: 'Yesterday', - from(date) - { - date.setUTCDate(date.getUTCDate() - 1); - return date; - }, - to: '' - }, - { - label: 'This week', - value: 'This week', - from(date) {return egw.week_start(date);}, - to(date) - { - date.setUTCDate(date.getUTCDate() + 6); - return date; - } - }, - { - label: 'Last week', - value: 'Last week', - from(date) - { - var d = egw.week_start(date); - d.setUTCDate(d.getUTCDate() - 7); - return d; - }, - to(date) - { - date.setUTCDate(date.getUTCDate() + 6); - return date; - } - }, - { - label: 'This month', - value: 'This month', - from(date) - { - date.setUTCDate(1); - return date; - }, - to(date) - { - date.setUTCMonth(date.getUTCMonth() + 1); - date.setUTCDate(0); - return date; - } - }, - { - label: 'Last month', - value: 'Last month', - from(date) - { - date.setUTCMonth(date.getUTCMonth() - 1); - date.setUTCDate(1); - return date; - }, - to(date) - { - date.setUTCMonth(date.getUTCMonth() + 1); - date.setUTCDate(0); - return date; - } - }, - { - label: 'Last 3 months', - value: 'Last 3 months', - from(date) - { - date.setUTCMonth(date.getUTCMonth() - 2); - date.setUTCDate(1); - return date; - }, - to(date) - { - date.setUTCMonth(date.getUTCMonth() + 3); - date.setUTCDate(0); - return date; - } - }, - /* - 'This quarter'=> array(0,0,0,0, 0,0,0,0), // Just a marker, needs special handling - 'Last quarter'=> array(0,-4,0,0, 0,-4,0,0), // Just a marker - */ - { - label: 'This year', - value: 'This year', - from(d) - { - d.setUTCMonth(0); - d.setUTCDate(1); - return d; - }, - to(d) - { - d.setUTCMonth(11); - d.setUTCDate(31); - return d; - } - }, - { - label: 'Last year', - value: 'Last year', - from(d) - { - d.setUTCMonth(0); - d.setUTCDate(1); - d.setUTCYear(d.getUTCYear() - 1); - return d; - }, - to(d) - { - d.setUTCMonth(11); - d.setUTCDate(31); - d.setUTCYear(d.getUTCYear() - 1); - return d; - } - } - ]; - - - connectedCallback() - { - super.connectedCallback(); - this.updateComplete.then(() => - { - if(!this.relative) - { - let options = this._fromNode.getOptions(); - //@ts-ignore rangePlugin is there, really - options.plugins.push(rangePlugin({input: this._toNode.findInputField()})); - } - }) - } - - render() - { - if(this.relative) - { - return this.relativeTemplate(); - } - return this.absoluteTemplate(); - } - - protected relativeTemplate() - { - return html` - - ${repeat(this.select_options, (d) => d.value, (o) => this._optionTemplate(o))} - - `; - } - - _optionTemplate(option : SelectOption) : TemplateResult - { - let icon = option.icon ? html` - ` : ""; - - // Tag used must match this.optionTag, but you can't use the variable directly. - // Pass option along so SearchMixin can grab it if needed - return html` - - ${icon} - ${this.egw().lang(option.label)} - `; - } - - protected absoluteTemplate() - { - return html` - - `; - } - - get select_options() : SelectOption[] - { - // @ts-ignore - const options = super.select_options || []; - // make sure result is unique - - return [...new Map([...options, ...(Et2DateRange.relative_dates || [])].map(item => - [item.value, item])).values()]; - - } - - get value() : string | string[] | { from : string; to : string } - { - return this.relative ? - (this._selectNode?.value || this.__value) : - {from: this._fromNode?.value, to: this._toNode?.value}; - } - - set value(new_value : string | string[] | { from : string, to : string }) - { - let oldValue = this.value; - if(!new_value || new_value == null || typeof new_value == "undefined") - { - this._selectNode.value = ''; - this._fromNode.value = null; - this._toNode.value = null; - } - // Relative - else if(new_value && typeof new_value === 'string') - { - this._set_relative_value(new_value); - } - else if(new_value && typeof new_value.from === 'undefined' && new_value[0]) - { - new_value = { - from: new_value[0], - to: new_value[1] || '' - }; - } - if(new_value && new_value.from && new_value.to) - { - this._fromNode._instance.setDate([new_value.from, new_value.to], false); - } - } - - _set_relative_value(_value) - { - - // Show description - this.__value = _value; - /* - let tempDate = new Date(); - let today = new Date(tempDate.getFullYear(), tempDate.getMonth(), tempDate.getDate(), 0, -tempDate.getTimezoneOffset(), 0); - - // Use strings to avoid references - this._fromNode.value = today.toJSON(); - this._toNode.value = today.toJSON(); - - let relative = null; - for(var index in Et2DateRange.relative_dates) - { - if(Et2DateRange.relative_dates[index].value === _value) - { - relative = Et2DateRange.relative_dates[index]; - break; - } - } - if(relative) - { - let dates = ["from", "to"]; - let value = today.toJSON(); - for(let i = 0; i < dates.length; i++) - { - let date = dates[i]; - if(typeof relative[date] == "function") - { - value = relative[date](new Date(value)); - } - else - { - value = this[date]._relativeDate(relative[date]); - } - this["_" + date + "Node"].value = value; - } - } - - */ - } - - /** - * Get the node where we're putting the options - * - * @returns {HTMLElement} - */ - get _optionTargetNode() : HTMLElement - { - return this._selectNode; - } - - /** - * Render select_options as child DOM Nodes - * Overridden here because we can do it in the normal way (render()) - * @protected - */ - protected _renderOptions() - {} - - get _selectNode() : Et2Select - { - return this.shadowRoot?.querySelector("[part='relative']"); - } - - get _fromNode() : Et2Date - { - return this.shadowRoot?.querySelector("[part='from']") - } - - get _toNode() : Et2Date - { - return this.shadowRoot?.querySelector("[part='to']") - } -} - -customElements.define("et2-date-range", Et2DateRange); \ No newline at end of file diff --git a/api/js/etemplate/Et2InputWidget/test/InputBasicTests.ts b/api/js/etemplate/Et2InputWidget/test/InputBasicTests.ts index ae5c88c188..e4c50d2e04 100644 --- a/api/js/etemplate/Et2InputWidget/test/InputBasicTests.ts +++ b/api/js/etemplate/Et2InputWidget/test/InputBasicTests.ts @@ -101,34 +101,5 @@ export function inputBasicTests(before : Function, test_value : string, value_se // widget returns what we gave it assert.equal(element.get_value(), test_value); }); - }); - - describe("Required", () => - { - beforeEach(async() => - { - element = await before(); - }); - - // This is just visually comparing for a difference, no deep inspection - it("looks different when required") - - /* - Not yet working attempt to have playwright compare visually - - const pre = await page.locator(element.localName).screenshot(); - - element.required = true; - - // wait for asychronous changes to the DOM - await elementUpdated(element); - - - const post = await page.locator(element.localName).screenshot(); - - expect(post).toMatchSnapshot(pre); - - */ - - }); + }) } \ No newline at end of file diff --git a/api/src/Etemplate/Widget/Date.php b/api/src/Etemplate/Widget/Date.php index 799f06767e..e4b2568cb5 100644 --- a/api/src/Etemplate/Widget/Date.php +++ b/api/src/Etemplate/Widget/Date.php @@ -70,14 +70,7 @@ class Date extends Transformer $form_name = self::form_name($cname, $this->id, $expand); $value =& self::get_array(self::$request->content, $form_name, false, true); - if($this->type == 'et2-date-range') - { - $value = $this->attrs['relative'] || $this->getElementAttribute($form_name, 'relative') ? - $value : - ['from' => is_array($value) && array_key_exists('from', $value) ? $this->format_date($value['from']) : '', - 'to' => is_array($value) && array_key_exists('from', $value) ? $this->format_date($value['to']) : '']; - } - elseif($this->type != 'date-duration' && $value) + if($this->type != 'date-duration' && $value) { $value = $this->format_date($value); } @@ -172,10 +165,6 @@ class Date extends Transformer $value = self::get_array($content, $form_name); $valid =& self::get_array($validated, $form_name, true); - if($value && $this->type == 'et2-date-range') - { - return $this->validateRange($form_name, $value, $valid); - } if($value && $this->type !== 'date-duration') { try @@ -293,29 +282,8 @@ class Date extends Transformer //error_log("$this : ($valid)" . Api\DateTime::to($valid)); } } - - protected function validateRange($form_name, $value, &$valid) - { - if($this->attrs['relative'] || $this->getElementAttribute($form_name, "relative")) - { - $valid = "" . $value; - return; - } - foreach(['from', 'to'] as $field) - { - if(!$value[$field]) - { - continue; - } - if(substr($value[$field], -1) === 'Z') - { - $value[$field] = substr($value[$field], 0, -1); - } - $valid[$field] = new Api\DateTime($value[$field]); - } - } } \EGroupware\Api\Etemplate\Widget::registerWidget(__NAMESPACE__ . '\\Date', - array('et2-date', 'et2-date-time', 'et2-date-range', 'time_or_date') + array('et2-date', 'et2-date-time', 'time_or_date') ); \ No newline at end of file