From 61b9713e15297ba6dd0d7a2d713eca17022e9b15 Mon Sep 17 00:00:00 2001 From: Mike Auteri Date: Sat, 6 Jan 2024 13:51:00 -0500 Subject: [PATCH 1/3] Fix translation. --- build/blocks/event-date/index.asset.php | 2 +- build/blocks/event-date/index.js | 3 ++- gatherpress.php | 1 + includes/core/classes/class-block.php | 4 +++- src/blocks/event-date/edit.js | 10 ++++++---- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/build/blocks/event-date/index.asset.php b/build/blocks/event-date/index.asset.php index 8e86143f6..2dd7d6ae7 100644 --- a/build/blocks/event-date/index.asset.php +++ b/build/blocks/event-date/index.asset.php @@ -1 +1 @@ - array('moment', 'react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-date', 'wp-element', 'wp-i18n'), 'version' => '57dcd8049cc5ec8fddaa'); + array('moment', 'react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-date', 'wp-element', 'wp-i18n'), 'version' => '0690b5405ff296fe9e6d'); diff --git a/build/blocks/event-date/index.js b/build/blocks/event-date/index.js index 4b4f1b68d..f2d4c632d 100644 --- a/build/blocks/event-date/index.js +++ b/build/blocks/event-date/index.js @@ -1 +1,2 @@ -(()=>{"use strict";var e,t={3484:(e,t,n)=>{const r=window.wp.blocks,a=window.React,o=window.moment;var s=n.n(o);const i=window.wp.blockEditor,l=window.wp.components,c=window.wp.element,m=(e,t="")=>{for(const[n,r]of Object.entries(e)){let e=n;t&&(e+="_"+String(t));const a=new CustomEvent(e,{detail:r});dispatchEvent(a)}},d=window.wp.data,p=window.wp.apiFetch;var u=n.n(p);const v=window.wp.i18n;function f(){(0,d.dispatch)("core/editor")?.editPost({meta:{_non_existing_meta:!0}})}function _(e){if("object"==typeof GatherPress)return e.split(".").reduce(((e,t)=>e&&e[t]),GatherPress)}function E(e,t){if("object"!=typeof GatherPress)return;const n=e.split("."),r=n.pop();n.reduce(((e,t)=>{var n;return null!==(n=e[t])&&void 0!==n?n:e[t]={}}),GatherPress)[r]=t}function g(){const e=s().tz(_("event_datetime.datetime_end"),b());return s().tz(b()).valueOf()>e.valueOf()}function h(){const e="gp_event_past",t=(0,d.dispatch)("core/notices");t.removeNotice(e),g()&&t.createNotice("warning",(0,v.__)("This event has already past.","gatherpress"),{id:e,isDismissible:!1})}const T="YYYY-MM-DDTHH:mm:ss",w="YYYY-MM-DD HH:mm:ss",z="MMMM D, YYYY h:mm a",b=(e=_("event_datetime.timezone"))=>s().tz.zone(e)?e:(0,v.__)("GMT","gatherpress"),S=(e="")=>{const t=/^([+-])(\d{2}):(00|15|30|45)$/,n=e.replace(t,"$1");return n!==e?"UTC"+n+parseInt(e.replace(t,"$2")).toString()+e.replace(t,"$3").replace("00","").replace("15",".25").replace("30",".5").replace("45",".75"):e},D=s().tz(b()).add(1,"day").set("hour",18).set("minute",0).set("second",0).format(T),y=s().tz(D,b()).add(2,"hours").format(T),O=(e,t=null)=>{!function(e){const t=s().tz(_("event_datetime.datetime_end"),b()).valueOf(),n=s().tz(e,b()).valueOf();if(n>=t){const e=s().tz(n,b()).add(2,"hours").format(T);k(e)}}(e),E("event_datetime.datetime_start",e),"function"==typeof t&&t(e),f()},k=(e,t=null)=>{!function(e){const t=s().tz(_("event_datetime.datetime_start"),b()).valueOf(),n=s().tz(e,b()).valueOf();if(n<=t){const e=s().tz(n,b()).subtract(2,"hours").format(T);O(e)}}(e),E("event_datetime.datetime_end",e),null!==t&&t(e),f()};function x(){const e=(0,d.select)("core/editor").isSavingPost(),t=(0,d.select)("core/editor").isAutosavingPost();"gp_event"===(0,d.select)("core/editor").getCurrentPostType()&&e&&!t&&u()({path:"/gatherpress/v1/event/datetime/",method:"POST",data:{post_id:_("post_id"),datetime_start:s().tz(_("event_datetime.datetime_start"),b()).format(w),datetime_end:s().tz(_("event_datetime.datetime_end"),b()).format(w),timezone:_("event_datetime.timezone"),_wpnonce:_("nonce")}}).then((()=>{!function(){const e="gp_event_communcation",t=(0,d.dispatch)("core/notices");t.removeNotice(e),"publish"!==(0,d.select)("core/editor").getEditedPostAttribute("status")||g()||t.createNotice("success",(0,v.__)("Send an event update to members via email?","gatherpress"),{id:e,isDismissible:!0,actions:[{onClick:()=>{m({setOpen:!0})},label:(0,v.__)("Compose Message","gatherpress")}]})}()}))}const P=e=>{const{isSelected:t}=e,n=t?"none":"block";return(0,a.createElement)("div",{style:{position:"relative"}},e.children,(0,a.createElement)("div",{style:{position:"absolute",top:"0",right:"0",bottom:"0",left:"0",display:n}}))},C=window.wp.date,M=e=>{const{dateTimeStart:t}=e;return s().tz(t,b()).format(z)},Y=e=>{const{dateTimeEnd:t}=e;return s().tz(t,b()).format(z)},j=e=>{const{dateTimeStart:t,setDateTimeStart:n}=e,r=(0,C.getSettings)(),o=/a(?!\\)/i.test(r.formats.time.toLowerCase().replace(/\\\\/g,"").split("").reverse().join(""));return(0,a.createElement)(l.DateTimePicker,{currentDate:t,onChange:e=>O(e,n),is12Hour:o})},F=e=>{const{dateTimeEnd:t,setDateTimeEnd:n}=e,r=(0,C.getSettings)(),o=/a(?!\\)/i.test(r.formats.time.toLowerCase().replace(/\\\\/g,"").split("").reverse().join(""));return(0,a.createElement)(l.DateTimePicker,{currentDate:t,onChange:e=>k(e,n),is12Hour:o})},I=e=>{const{dateTimeStart:t,setDateTimeStart:n}=e;return(0,c.useEffect)((()=>{n(s().tz((()=>{let e=_("event_datetime.datetime_start");return e=""!==e?s().tz(e,b()).format(T):D,E("event_datetime.datetime_start",e),e})(),b()).format(T)),m({setDateTimeStart:t}),h()})),(0,a.createElement)(l.PanelRow,null,(0,a.createElement)(l.Flex,null,(0,a.createElement)(l.FlexItem,null,(0,v.__)("Start","gatherpress")),(0,a.createElement)(l.FlexItem,null,(0,a.createElement)(l.Dropdown,{popoverProps:{placement:"bottom-end"},renderToggle:({isOpen:e,onToggle:n})=>(0,a.createElement)(l.Button,{onClick:n,"aria-expanded":e,isLink:!0},(0,a.createElement)(M,{dateTimeStart:t})),renderContent:()=>(0,a.createElement)(j,{dateTimeStart:t,setDateTimeStart:n})}))))},$=e=>{const{dateTimeEnd:t,setDateTimeEnd:n}=e;return(0,c.useEffect)((()=>{n(s().tz((()=>{let e=_("event_datetime.datetime_end");return e=""!==e?s().tz(e,b()).format(T):y,E("event_datetime.datetime_end",e),e})(),b()).format(T)),m({setDateTimeEnd:t}),h()})),(0,a.createElement)(l.PanelRow,null,(0,a.createElement)(l.Flex,null,(0,a.createElement)(l.FlexItem,null,(0,v.__)("End","gatherpress")),(0,a.createElement)(l.FlexItem,null,(0,a.createElement)(l.Dropdown,{popoverProps:{placement:"bottom-end"},renderToggle:({isOpen:e,onToggle:n})=>(0,a.createElement)(l.Button,{onClick:n,"aria-expanded":e,isLink:!0},(0,a.createElement)(Y,{dateTimeEnd:t})),renderContent:()=>(0,a.createElement)(F,{dateTimeEnd:t,setDateTimeEnd:n})}))))},G=e=>{const{timezone:t,setTimezone:n}=e,r=_("timezone_choices");return(0,c.useEffect)((()=>{n(_("event_datetime.timezone"))}),[n]),(0,c.useEffect)((()=>{m({setTimezone:_("event_datetime.timezone")})})),(0,a.createElement)(l.PanelRow,null,(0,a.createElement)(l.SelectControl,{label:(0,v.__)("Time Zone","gatherpress"),value:S(t),onChange:e=>{e=((e="")=>{const t=/^UTC([+-])(\d+)(.\d+)?$/,n=e.replace(t,"$1");if(n!==e){const r=e.replace(t,"$2").padStart(2,"0");let a=e.replace(t,"$3");return""===a&&(a=":00"),a=a.replace(".25",":15").replace(".5",":30").replace(".75",":45"),n+r+a}return e})(e),n(e),E("event_datetime.timezone",e),f()}},Object.keys(r).map((e=>(0,a.createElement)("optgroup",{key:e,label:e},Object.keys(r[e]).map((t=>(0,a.createElement)("option",{key:t,value:t},r[e][t]))))))))},H=()=>{const[e,t]=(0,c.useState)(),[n,r]=(0,c.useState)(),[o,s]=(0,c.useState)();return(0,d.subscribe)(x),(0,a.createElement)(a.Fragment,null,(0,a.createElement)("section",null,(0,a.createElement)("h3",null,(0,v.__)("Date & time","gatherpress")),(0,a.createElement)(I,{dateTimeStart:e,setDateTimeStart:t}),(0,a.createElement)($,{dateTimeEnd:n,setDateTimeEnd:r})),(0,a.createElement)("section",null,(0,a.createElement)(G,{timezone:o,setTimezone:s})))},N=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":2,"name":"gatherpress/event-date","version":"1.0.0","title":"Event Date","category":"gatherpress","icon":"clock","example":{},"description":"Display and edit event dates.","attributes":{"eventEnd":{"type":"string"},"eventStart":{"type":"string"}},"supports":{"html":false},"textdomain":"gatherpress","editorScript":"file:./index.js","style":"file:./style-index.css","render":"file:./render.php"}');(0,r.registerBlockType)(N,{edit:()=>{const e=(0,i.useBlockProps)(),[t,n]=(0,c.useState)(D),[r,o]=(0,c.useState)(y),[m,d]=(0,c.useState)(b());return((e,t="")=>{for(const[n,r]of Object.entries(e)){let e=n;t&&(e+="_"+String(t)),addEventListener(e,(e=>{r(e.detail)}),!1)}})({setDateTimeEnd:o,setDateTimeStart:n,setTimezone:d}),(0,a.createElement)("div",{...e},(0,a.createElement)(P,null,(0,a.createElement)(l.Flex,{justify:"normal",align:"flex-start",gap:"4"},(0,a.createElement)(l.FlexItem,{display:"flex",className:"gp-event-date__icon"},(0,a.createElement)(l.Icon,{icon:"clock"})),(0,a.createElement)(l.FlexItem,null,((e,t,n)=>{const r="dddd, MMMM D, YYYY",a="h:mm A",o=r+" "+a,i=b(n);let l=r+" "+a+" z";return s().tz(e,i).format(r)===s().tz(t,i).format(r)&&(l=a+" z"),s().tz(e,i).format(o)+" to "+s().tz(t,i).format(l)+(e=>(e=b(e),(0,v.__)("GMT","gatherpress")!==e?"":((e="")=>e.replace(":",""))(_("event_datetime.timezone"))))(i)})(t,r,m)),(0,a.createElement)(i.InspectorControls,null,(0,a.createElement)(l.PanelBody,null,(0,a.createElement)(H,null))))))},save:()=>null})}},n={};function r(e){var a=n[e];if(void 0!==a)return a.exports;var o=n[e]={exports:{}};return t[e](o,o.exports,r),o.exports}r.m=t,e=[],r.O=(t,n,a,o)=>{if(!n){var s=1/0;for(m=0;m=o)&&Object.keys(r.O).every((e=>r.O[e](n[l])))?n.splice(l--,1):(i=!1,o0&&e[m-1][2]>o;m--)e[m]=e[m-1];e[m]=[n,a,o]},r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={591:0,42:0};r.O.j=t=>0===e[t];var t=(t,n)=>{var a,o,[s,i,l]=n,c=0;if(s.some((t=>0!==e[t]))){for(a in i)r.o(i,a)&&(r.m[a]=i[a]);if(l)var m=l(r)}for(t&&t(n);cr(3484)));a=r.O(a)})(); \ No newline at end of file +(()=>{"use strict";var e,t={3484:(e,t,n)=>{const r=window.wp.blocks,a=window.React,o=window.moment;var s=n.n(o);const i=window.wp.i18n,l=window.wp.blockEditor,c=window.wp.components,m=window.wp.element,d=(e,t="")=>{for(const[n,r]of Object.entries(e)){let e=n;t&&(e+="_"+String(t));const a=new CustomEvent(e,{detail:r});dispatchEvent(a)}},p=window.wp.data,u=window.wp.apiFetch;var f=n.n(u);function v(){(0,p.dispatch)("core/editor")?.editPost({meta:{_non_existing_meta:!0}})}function _(e){if("object"==typeof GatherPress)return e.split(".").reduce(((e,t)=>e&&e[t]),GatherPress)}function E(e,t){if("object"!=typeof GatherPress)return;const n=e.split("."),r=n.pop();n.reduce(((e,t)=>{var n;return null!==(n=e[t])&&void 0!==n?n:e[t]={}}),GatherPress)[r]=t}function g(){const e=s().tz(_("event_datetime.datetime_end"),b());return s().tz(b()).valueOf()>e.valueOf()}function h(){const e="gp_event_past",t=(0,p.dispatch)("core/notices");t.removeNotice(e),g()&&t.createNotice("warning",(0,i.__)("This event has already past.","gatherpress"),{id:e,isDismissible:!1})}const T="YYYY-MM-DDTHH:mm:ss",w="YYYY-MM-DD HH:mm:ss",z="MMMM D, YYYY h:mm a",b=(e=_("event_datetime.timezone"))=>s().tz.zone(e)?e:(0,i.__)("GMT","gatherpress"),S=(e="")=>{const t=/^([+-])(\d{2}):(00|15|30|45)$/,n=e.replace(t,"$1");return n!==e?"UTC"+n+parseInt(e.replace(t,"$2")).toString()+e.replace(t,"$3").replace("00","").replace("15",".25").replace("30",".5").replace("45",".75"):e},D=s().tz(b()).add(1,"day").set("hour",18).set("minute",0).set("second",0).format(T),y=s().tz(D,b()).add(2,"hours").format(T),O=(e,t=null)=>{!function(e){const t=s().tz(_("event_datetime.datetime_end"),b()).valueOf(),n=s().tz(e,b()).valueOf();if(n>=t){const e=s().tz(n,b()).add(2,"hours").format(T);k(e)}}(e),E("event_datetime.datetime_start",e),"function"==typeof t&&t(e),v()},k=(e,t=null)=>{!function(e){const t=s().tz(_("event_datetime.datetime_start"),b()).valueOf(),n=s().tz(e,b()).valueOf();if(n<=t){const e=s().tz(n,b()).subtract(2,"hours").format(T);O(e)}}(e),E("event_datetime.datetime_end",e),null!==t&&t(e),v()};function x(){const e=(0,p.select)("core/editor").isSavingPost(),t=(0,p.select)("core/editor").isAutosavingPost();"gp_event"===(0,p.select)("core/editor").getCurrentPostType()&&e&&!t&&f()({path:"/gatherpress/v1/event/datetime/",method:"POST",data:{post_id:_("post_id"),datetime_start:s().tz(_("event_datetime.datetime_start"),b()).format(w),datetime_end:s().tz(_("event_datetime.datetime_end"),b()).format(w),timezone:_("event_datetime.timezone"),_wpnonce:_("nonce")}}).then((()=>{!function(){const e="gp_event_communcation",t=(0,p.dispatch)("core/notices");t.removeNotice(e),"publish"!==(0,p.select)("core/editor").getEditedPostAttribute("status")||g()||t.createNotice("success",(0,i.__)("Send an event update to members via email?","gatherpress"),{id:e,isDismissible:!0,actions:[{onClick:()=>{d({setOpen:!0})},label:(0,i.__)("Compose Message","gatherpress")}]})}()}))}const P=e=>{const{isSelected:t}=e,n=t?"none":"block";return(0,a.createElement)("div",{style:{position:"relative"}},e.children,(0,a.createElement)("div",{style:{position:"absolute",top:"0",right:"0",bottom:"0",left:"0",display:n}}))},C=window.wp.date,M=e=>{const{dateTimeStart:t}=e;return s().tz(t,b()).format(z)},Y=e=>{const{dateTimeEnd:t}=e;return s().tz(t,b()).format(z)},j=e=>{const{dateTimeStart:t,setDateTimeStart:n}=e,r=(0,C.getSettings)(),o=/a(?!\\)/i.test(r.formats.time.toLowerCase().replace(/\\\\/g,"").split("").reverse().join(""));return(0,a.createElement)(c.DateTimePicker,{currentDate:t,onChange:e=>O(e,n),is12Hour:o})},$=e=>{const{dateTimeEnd:t,setDateTimeEnd:n}=e,r=(0,C.getSettings)(),o=/a(?!\\)/i.test(r.formats.time.toLowerCase().replace(/\\\\/g,"").split("").reverse().join(""));return(0,a.createElement)(c.DateTimePicker,{currentDate:t,onChange:e=>k(e,n),is12Hour:o})},F=e=>{const{dateTimeStart:t,setDateTimeStart:n}=e;return(0,m.useEffect)((()=>{n(s().tz((()=>{let e=_("event_datetime.datetime_start");return e=""!==e?s().tz(e,b()).format(T):D,E("event_datetime.datetime_start",e),e})(),b()).format(T)),d({setDateTimeStart:t}),h()})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.Flex,null,(0,a.createElement)(c.FlexItem,null,(0,i.__)("Start","gatherpress")),(0,a.createElement)(c.FlexItem,null,(0,a.createElement)(c.Dropdown,{popoverProps:{placement:"bottom-end"},renderToggle:({isOpen:e,onToggle:n})=>(0,a.createElement)(c.Button,{onClick:n,"aria-expanded":e,isLink:!0},(0,a.createElement)(M,{dateTimeStart:t})),renderContent:()=>(0,a.createElement)(j,{dateTimeStart:t,setDateTimeStart:n})}))))},I=e=>{const{dateTimeEnd:t,setDateTimeEnd:n}=e;return(0,m.useEffect)((()=>{n(s().tz((()=>{let e=_("event_datetime.datetime_end");return e=""!==e?s().tz(e,b()).format(T):y,E("event_datetime.datetime_end",e),e})(),b()).format(T)),d({setDateTimeEnd:t}),h()})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.Flex,null,(0,a.createElement)(c.FlexItem,null,(0,i.__)("End","gatherpress")),(0,a.createElement)(c.FlexItem,null,(0,a.createElement)(c.Dropdown,{popoverProps:{placement:"bottom-end"},renderToggle:({isOpen:e,onToggle:n})=>(0,a.createElement)(c.Button,{onClick:n,"aria-expanded":e,isLink:!0},(0,a.createElement)(Y,{dateTimeEnd:t})),renderContent:()=>(0,a.createElement)($,{dateTimeEnd:t,setDateTimeEnd:n})}))))},G=e=>{const{timezone:t,setTimezone:n}=e,r=_("timezone_choices");return(0,m.useEffect)((()=>{n(_("event_datetime.timezone"))}),[n]),(0,m.useEffect)((()=>{d({setTimezone:_("event_datetime.timezone")})})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.SelectControl,{label:(0,i.__)("Time Zone","gatherpress"),value:S(t),onChange:e=>{e=((e="")=>{const t=/^UTC([+-])(\d+)(.\d+)?$/,n=e.replace(t,"$1");if(n!==e){const r=e.replace(t,"$2").padStart(2,"0");let a=e.replace(t,"$3");return""===a&&(a=":00"),a=a.replace(".25",":15").replace(".5",":30").replace(".75",":45"),n+r+a}return e})(e),n(e),E("event_datetime.timezone",e),v()}},Object.keys(r).map((e=>(0,a.createElement)("optgroup",{key:e,label:e},Object.keys(r[e]).map((t=>(0,a.createElement)("option",{key:t,value:t},r[e][t]))))))))},H=()=>{const[e,t]=(0,m.useState)(),[n,r]=(0,m.useState)(),[o,s]=(0,m.useState)();return(0,p.subscribe)(x),(0,a.createElement)(a.Fragment,null,(0,a.createElement)("section",null,(0,a.createElement)("h3",null,(0,i.__)("Date & time","gatherpress")),(0,a.createElement)(F,{dateTimeStart:e,setDateTimeStart:t}),(0,a.createElement)(I,{dateTimeEnd:n,setDateTimeEnd:r})),(0,a.createElement)("section",null,(0,a.createElement)(G,{timezone:o,setTimezone:s})))},N=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":2,"name":"gatherpress/event-date","version":"1.0.0","title":"Event Date","category":"gatherpress","icon":"clock","example":{},"description":"Display and edit event dates.","attributes":{"eventEnd":{"type":"string"},"eventStart":{"type":"string"}},"supports":{"html":false},"textdomain":"gatherpress","editorScript":"file:./index.js","style":"file:./style-index.css","render":"file:./render.php"}');(0,r.registerBlockType)(N,{edit:()=>{const e=(0,l.useBlockProps)(),[t,n]=(0,m.useState)(D),[r,o]=(0,m.useState)(y),[d,p]=(0,m.useState)(b());return((e,t="")=>{for(const[n,r]of Object.entries(e)){let e=n;t&&(e+="_"+String(t)),addEventListener(e,(e=>{r(e.detail)}),!1)}})({setDateTimeEnd:o,setDateTimeStart:n,setTimezone:p}),(0,a.createElement)("div",{...e},(0,a.createElement)(P,null,(0,a.createElement)(c.Flex,{justify:"normal",align:"flex-start",gap:"4"},(0,a.createElement)(c.FlexItem,{display:"flex",className:"gp-event-date__icon"},(0,a.createElement)(c.Icon,{icon:"clock"})),(0,a.createElement)(c.FlexItem,null,((e,t,n)=>{const r="dddd, MMMM D, YYYY",a="h:mm A",o=r+" "+a,l=b(n);let c=r+" "+a+" z";return s().tz(e,l).format(r)===s().tz(t,l).format(r)&&(c=a+" z"),(0,i.sprintf)(/* translators: %1$s: datetime start, %2$s: datetime end, %3$s timezone. */ +(0,i.__)("%1$s to %2$s %3$s"),s().tz(e,l).format(o),s().tz(t,l).format(c),(e=>(e=b(e),(0,i.__)("GMT","gatherpress")!==e?"":((e="")=>e.replace(":",""))(_("event_datetime.timezone"))))(l))})(t,r,d)),(0,a.createElement)(l.InspectorControls,null,(0,a.createElement)(c.PanelBody,null,(0,a.createElement)(H,null))))))},save:()=>null})}},n={};function r(e){var a=n[e];if(void 0!==a)return a.exports;var o=n[e]={exports:{}};return t[e](o,o.exports,r),o.exports}r.m=t,e=[],r.O=(t,n,a,o)=>{if(!n){var s=1/0;for(m=0;m=o)&&Object.keys(r.O).every((e=>r.O[e](n[l])))?n.splice(l--,1):(i=!1,o0&&e[m-1][2]>o;m--)e[m]=e[m-1];e[m]=[n,a,o]},r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={591:0,42:0};r.O.j=t=>0===e[t];var t=(t,n)=>{var a,o,[s,i,l]=n,c=0;if(s.some((t=>0!==e[t]))){for(a in i)r.o(i,a)&&(r.m[a]=i[a]);if(l)var m=l(r)}for(t&&t(n);cr(3484)));a=r.O(a)})(); \ No newline at end of file diff --git a/gatherpress.php b/gatherpress.php index ecdb978b8..f011ec594 100644 --- a/gatherpress.php +++ b/gatherpress.php @@ -8,6 +8,7 @@ * Version: 0.26.0 * Requires PHP: 7.4 * Text Domain: gatherpress + * Domain Path: /languages * License: GPLv2 or later (license.txt) * * This file serves as the main plugin file for GatherPress. It defines the plugin's basic information, diff --git a/includes/core/classes/class-block.php b/includes/core/classes/class-block.php index 7e255c502..91f4f5a80 100644 --- a/includes/core/classes/class-block.php +++ b/includes/core/classes/class-block.php @@ -85,7 +85,9 @@ public function register_blocks(): void { $blocks_directory = sprintf( '%1$s/build/blocks/', GATHERPRESS_CORE_PATH ); $blocks = array_diff( scandir( $blocks_directory ), array( '..', '.' ) ); foreach ( $blocks as $block ) { - register_block_type( sprintf( '%1$s/build/blocks/%2$s', GATHERPRESS_CORE_PATH, $block ) ); + register_block_type( + sprintf( '%1$s/build/blocks/%2$s', GATHERPRESS_CORE_PATH, $block ) + ); } } } diff --git a/src/blocks/event-date/edit.js b/src/blocks/event-date/edit.js index 627f52000..ae700b294 100644 --- a/src/blocks/event-date/edit.js +++ b/src/blocks/event-date/edit.js @@ -6,6 +6,7 @@ import moment from 'moment'; /** * WordPress dependencies. */ +import { __, sprintf } from '@wordpress/i18n'; import { InspectorControls, useBlockProps } from '@wordpress/block-editor'; import { Flex, FlexItem, Icon, PanelBody } from '@wordpress/components'; import { useState } from '@wordpress/element'; @@ -46,10 +47,11 @@ const displayDateTime = (start, end, tz) => { endFormat = timeFormat + ' ' + timeZoneFormat; } - return ( - moment.tz(start, timeZone).format(startFormat) + - ' to ' + - moment.tz(end, timeZone).format(endFormat) + + return sprintf( + /* translators: %1$s: datetime start, %2$s: datetime end, %3$s timezone. */ + __('%1$s to %2$s %3$s'), + moment.tz(start, timeZone).format(startFormat), + moment.tz(end, timeZone).format(endFormat), getUtcOffset(timeZone) ); }; From 22b0b18fa0a4d86b828d0596a6f10f2f5a4f1c6c Mon Sep 17 00:00:00 2001 From: Mike Auteri Date: Sat, 6 Jan 2024 14:07:28 -0500 Subject: [PATCH 2/3] More fixes and updates for translations. --- build/blocks/add-to-calendar/index.asset.php | 2 +- build/blocks/add-to-calendar/index.js | 2 +- build/blocks/event-date/index.asset.php | 2 +- build/blocks/event-date/index.js | 2 +- includes/core/classes/class-assets.php | 8 ++++++++ includes/core/classes/class-block.php | 3 ++- src/blocks/add-to-calendar/edit.js | 2 +- src/blocks/event-date/edit.js | 2 +- test/unit/php/includes/core/classes/class-test-block.php | 2 +- 9 files changed, 17 insertions(+), 8 deletions(-) diff --git a/build/blocks/add-to-calendar/index.asset.php b/build/blocks/add-to-calendar/index.asset.php index 0524634ce..0a6ec080c 100644 --- a/build/blocks/add-to-calendar/index.asset.php +++ b/build/blocks/add-to-calendar/index.asset.php @@ -1 +1 @@ - array('react', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-i18n'), 'version' => '5b5e3a5e4641662e48ab'); + array('react', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-i18n'), 'version' => 'f3909d9560bbd3b75020'); diff --git a/build/blocks/add-to-calendar/index.js b/build/blocks/add-to-calendar/index.js index 04d365614..f1e7e4140 100644 --- a/build/blocks/add-to-calendar/index.js +++ b/build/blocks/add-to-calendar/index.js @@ -1 +1 @@ -(()=>{"use strict";var e,t={5045:()=>{const e=window.wp.blocks,t=window.React,r=window.wp.i18n,n=window.wp.blockEditor,a=window.wp.components,l=e=>{const{isSelected:r}=e,n=r?"none":"block";return(0,t.createElement)("div",{style:{position:"relative"}},e.children,(0,t.createElement)("div",{style:{position:"absolute",top:"0",right:"0",bottom:"0",left:"0",display:n}}))},o=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":2,"name":"gatherpress/add-to-calendar","version":"1.0.0","title":"Add to Calendar","category":"gatherpress","icon":"calendar","example":{},"description":"An applet block to add the event to your preferred calendar.","attributes":{"blockId":{"type":"string"}},"supports":{"html":false},"textdomain":"gatherpress","editorScript":"file:./index.js","style":"file:./style-index.css","viewScript":"file:./add-to-calendar.js","render":"file:./render.php"}');(0,e.registerBlockType)(o,{edit:()=>{const e=(0,n.useBlockProps)();return(0,t.createElement)("div",{...e},(0,t.createElement)(l,null,(0,t.createElement)(a.Flex,{justify:"normal",align:"flex-start",gap:"4"},(0,t.createElement)(a.FlexItem,{display:"flex",className:"gp-event-date__icon"},(0,t.createElement)(a.Icon,{icon:"calendar"})),(0,t.createElement)(a.FlexItem,null,(0,t.createElement)("a",{href:"#"},(0,r.__)("Add to calendar","gatherpress"))))))},save:()=>null})}},r={};function n(e){var a=r[e];if(void 0!==a)return a.exports;var l=r[e]={exports:{}};return t[e](l,l.exports,n),l.exports}n.m=t,e=[],n.O=(t,r,a,l)=>{if(!r){var o=1/0;for(p=0;p=l)&&Object.keys(n.O).every((e=>n.O[e](r[i])))?r.splice(i--,1):(s=!1,l0&&e[p-1][2]>l;p--)e[p]=e[p-1];e[p]=[r,a,l]},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={981:0,443:0};n.O.j=t=>0===e[t];var t=(t,r)=>{var a,l,[o,s,i]=r,c=0;if(o.some((t=>0!==e[t]))){for(a in s)n.o(s,a)&&(n.m[a]=s[a]);if(i)var p=i(n)}for(t&&t(r);cn(5045)));a=n.O(a)})(); \ No newline at end of file +(()=>{"use strict";var e,t={5045:()=>{const e=window.wp.blocks,t=window.React,r=window.wp.i18n,n=window.wp.blockEditor,a=window.wp.components,l=e=>{const{isSelected:r}=e,n=r?"none":"block";return(0,t.createElement)("div",{style:{position:"relative"}},e.children,(0,t.createElement)("div",{style:{position:"absolute",top:"0",right:"0",bottom:"0",left:"0",display:n}}))},o=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":2,"name":"gatherpress/add-to-calendar","version":"1.0.0","title":"Add to Calendar","category":"gatherpress","icon":"calendar","example":{},"description":"An applet block to add the event to your preferred calendar.","attributes":{"blockId":{"type":"string"}},"supports":{"html":false},"textdomain":"gatherpress","editorScript":"file:./index.js","style":"file:./style-index.css","viewScript":"file:./add-to-calendar.js","render":"file:./render.php"}');(0,e.registerBlockType)(o,{edit:()=>{const e=(0,n.useBlockProps)();return(0,t.createElement)("div",{...e},(0,t.createElement)(l,null,(0,t.createElement)(a.Flex,{justify:"normal",align:"center",gap:"4"},(0,t.createElement)(a.FlexItem,{display:"flex",className:"gp-event-date__icon"},(0,t.createElement)(a.Icon,{icon:"calendar"})),(0,t.createElement)(a.FlexItem,null,(0,t.createElement)("a",{href:"#"},(0,r.__)("Add to calendar","gatherpress"))))))},save:()=>null})}},r={};function n(e){var a=r[e];if(void 0!==a)return a.exports;var l=r[e]={exports:{}};return t[e](l,l.exports,n),l.exports}n.m=t,e=[],n.O=(t,r,a,l)=>{if(!r){var o=1/0;for(p=0;p=l)&&Object.keys(n.O).every((e=>n.O[e](r[i])))?r.splice(i--,1):(s=!1,l0&&e[p-1][2]>l;p--)e[p]=e[p-1];e[p]=[r,a,l]},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={981:0,443:0};n.O.j=t=>0===e[t];var t=(t,r)=>{var a,l,[o,s,i]=r,c=0;if(o.some((t=>0!==e[t]))){for(a in s)n.o(s,a)&&(n.m[a]=s[a]);if(i)var p=i(n)}for(t&&t(r);cn(5045)));a=n.O(a)})(); \ No newline at end of file diff --git a/build/blocks/event-date/index.asset.php b/build/blocks/event-date/index.asset.php index 2dd7d6ae7..5646d6f29 100644 --- a/build/blocks/event-date/index.asset.php +++ b/build/blocks/event-date/index.asset.php @@ -1 +1 @@ - array('moment', 'react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-date', 'wp-element', 'wp-i18n'), 'version' => '0690b5405ff296fe9e6d'); + array('moment', 'react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-date', 'wp-element', 'wp-i18n'), 'version' => 'f3ff15c2dc0e1c16a3d7'); diff --git a/build/blocks/event-date/index.js b/build/blocks/event-date/index.js index f2d4c632d..fd3d19567 100644 --- a/build/blocks/event-date/index.js +++ b/build/blocks/event-date/index.js @@ -1,2 +1,2 @@ -(()=>{"use strict";var e,t={3484:(e,t,n)=>{const r=window.wp.blocks,a=window.React,o=window.moment;var s=n.n(o);const i=window.wp.i18n,l=window.wp.blockEditor,c=window.wp.components,m=window.wp.element,d=(e,t="")=>{for(const[n,r]of Object.entries(e)){let e=n;t&&(e+="_"+String(t));const a=new CustomEvent(e,{detail:r});dispatchEvent(a)}},p=window.wp.data,u=window.wp.apiFetch;var f=n.n(u);function v(){(0,p.dispatch)("core/editor")?.editPost({meta:{_non_existing_meta:!0}})}function _(e){if("object"==typeof GatherPress)return e.split(".").reduce(((e,t)=>e&&e[t]),GatherPress)}function E(e,t){if("object"!=typeof GatherPress)return;const n=e.split("."),r=n.pop();n.reduce(((e,t)=>{var n;return null!==(n=e[t])&&void 0!==n?n:e[t]={}}),GatherPress)[r]=t}function g(){const e=s().tz(_("event_datetime.datetime_end"),b());return s().tz(b()).valueOf()>e.valueOf()}function h(){const e="gp_event_past",t=(0,p.dispatch)("core/notices");t.removeNotice(e),g()&&t.createNotice("warning",(0,i.__)("This event has already past.","gatherpress"),{id:e,isDismissible:!1})}const T="YYYY-MM-DDTHH:mm:ss",w="YYYY-MM-DD HH:mm:ss",z="MMMM D, YYYY h:mm a",b=(e=_("event_datetime.timezone"))=>s().tz.zone(e)?e:(0,i.__)("GMT","gatherpress"),S=(e="")=>{const t=/^([+-])(\d{2}):(00|15|30|45)$/,n=e.replace(t,"$1");return n!==e?"UTC"+n+parseInt(e.replace(t,"$2")).toString()+e.replace(t,"$3").replace("00","").replace("15",".25").replace("30",".5").replace("45",".75"):e},D=s().tz(b()).add(1,"day").set("hour",18).set("minute",0).set("second",0).format(T),y=s().tz(D,b()).add(2,"hours").format(T),O=(e,t=null)=>{!function(e){const t=s().tz(_("event_datetime.datetime_end"),b()).valueOf(),n=s().tz(e,b()).valueOf();if(n>=t){const e=s().tz(n,b()).add(2,"hours").format(T);k(e)}}(e),E("event_datetime.datetime_start",e),"function"==typeof t&&t(e),v()},k=(e,t=null)=>{!function(e){const t=s().tz(_("event_datetime.datetime_start"),b()).valueOf(),n=s().tz(e,b()).valueOf();if(n<=t){const e=s().tz(n,b()).subtract(2,"hours").format(T);O(e)}}(e),E("event_datetime.datetime_end",e),null!==t&&t(e),v()};function x(){const e=(0,p.select)("core/editor").isSavingPost(),t=(0,p.select)("core/editor").isAutosavingPost();"gp_event"===(0,p.select)("core/editor").getCurrentPostType()&&e&&!t&&f()({path:"/gatherpress/v1/event/datetime/",method:"POST",data:{post_id:_("post_id"),datetime_start:s().tz(_("event_datetime.datetime_start"),b()).format(w),datetime_end:s().tz(_("event_datetime.datetime_end"),b()).format(w),timezone:_("event_datetime.timezone"),_wpnonce:_("nonce")}}).then((()=>{!function(){const e="gp_event_communcation",t=(0,p.dispatch)("core/notices");t.removeNotice(e),"publish"!==(0,p.select)("core/editor").getEditedPostAttribute("status")||g()||t.createNotice("success",(0,i.__)("Send an event update to members via email?","gatherpress"),{id:e,isDismissible:!0,actions:[{onClick:()=>{d({setOpen:!0})},label:(0,i.__)("Compose Message","gatherpress")}]})}()}))}const P=e=>{const{isSelected:t}=e,n=t?"none":"block";return(0,a.createElement)("div",{style:{position:"relative"}},e.children,(0,a.createElement)("div",{style:{position:"absolute",top:"0",right:"0",bottom:"0",left:"0",display:n}}))},C=window.wp.date,M=e=>{const{dateTimeStart:t}=e;return s().tz(t,b()).format(z)},Y=e=>{const{dateTimeEnd:t}=e;return s().tz(t,b()).format(z)},j=e=>{const{dateTimeStart:t,setDateTimeStart:n}=e,r=(0,C.getSettings)(),o=/a(?!\\)/i.test(r.formats.time.toLowerCase().replace(/\\\\/g,"").split("").reverse().join(""));return(0,a.createElement)(c.DateTimePicker,{currentDate:t,onChange:e=>O(e,n),is12Hour:o})},$=e=>{const{dateTimeEnd:t,setDateTimeEnd:n}=e,r=(0,C.getSettings)(),o=/a(?!\\)/i.test(r.formats.time.toLowerCase().replace(/\\\\/g,"").split("").reverse().join(""));return(0,a.createElement)(c.DateTimePicker,{currentDate:t,onChange:e=>k(e,n),is12Hour:o})},F=e=>{const{dateTimeStart:t,setDateTimeStart:n}=e;return(0,m.useEffect)((()=>{n(s().tz((()=>{let e=_("event_datetime.datetime_start");return e=""!==e?s().tz(e,b()).format(T):D,E("event_datetime.datetime_start",e),e})(),b()).format(T)),d({setDateTimeStart:t}),h()})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.Flex,null,(0,a.createElement)(c.FlexItem,null,(0,i.__)("Start","gatherpress")),(0,a.createElement)(c.FlexItem,null,(0,a.createElement)(c.Dropdown,{popoverProps:{placement:"bottom-end"},renderToggle:({isOpen:e,onToggle:n})=>(0,a.createElement)(c.Button,{onClick:n,"aria-expanded":e,isLink:!0},(0,a.createElement)(M,{dateTimeStart:t})),renderContent:()=>(0,a.createElement)(j,{dateTimeStart:t,setDateTimeStart:n})}))))},I=e=>{const{dateTimeEnd:t,setDateTimeEnd:n}=e;return(0,m.useEffect)((()=>{n(s().tz((()=>{let e=_("event_datetime.datetime_end");return e=""!==e?s().tz(e,b()).format(T):y,E("event_datetime.datetime_end",e),e})(),b()).format(T)),d({setDateTimeEnd:t}),h()})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.Flex,null,(0,a.createElement)(c.FlexItem,null,(0,i.__)("End","gatherpress")),(0,a.createElement)(c.FlexItem,null,(0,a.createElement)(c.Dropdown,{popoverProps:{placement:"bottom-end"},renderToggle:({isOpen:e,onToggle:n})=>(0,a.createElement)(c.Button,{onClick:n,"aria-expanded":e,isLink:!0},(0,a.createElement)(Y,{dateTimeEnd:t})),renderContent:()=>(0,a.createElement)($,{dateTimeEnd:t,setDateTimeEnd:n})}))))},G=e=>{const{timezone:t,setTimezone:n}=e,r=_("timezone_choices");return(0,m.useEffect)((()=>{n(_("event_datetime.timezone"))}),[n]),(0,m.useEffect)((()=>{d({setTimezone:_("event_datetime.timezone")})})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.SelectControl,{label:(0,i.__)("Time Zone","gatherpress"),value:S(t),onChange:e=>{e=((e="")=>{const t=/^UTC([+-])(\d+)(.\d+)?$/,n=e.replace(t,"$1");if(n!==e){const r=e.replace(t,"$2").padStart(2,"0");let a=e.replace(t,"$3");return""===a&&(a=":00"),a=a.replace(".25",":15").replace(".5",":30").replace(".75",":45"),n+r+a}return e})(e),n(e),E("event_datetime.timezone",e),v()}},Object.keys(r).map((e=>(0,a.createElement)("optgroup",{key:e,label:e},Object.keys(r[e]).map((t=>(0,a.createElement)("option",{key:t,value:t},r[e][t]))))))))},H=()=>{const[e,t]=(0,m.useState)(),[n,r]=(0,m.useState)(),[o,s]=(0,m.useState)();return(0,p.subscribe)(x),(0,a.createElement)(a.Fragment,null,(0,a.createElement)("section",null,(0,a.createElement)("h3",null,(0,i.__)("Date & time","gatherpress")),(0,a.createElement)(F,{dateTimeStart:e,setDateTimeStart:t}),(0,a.createElement)(I,{dateTimeEnd:n,setDateTimeEnd:r})),(0,a.createElement)("section",null,(0,a.createElement)(G,{timezone:o,setTimezone:s})))},N=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":2,"name":"gatherpress/event-date","version":"1.0.0","title":"Event Date","category":"gatherpress","icon":"clock","example":{},"description":"Display and edit event dates.","attributes":{"eventEnd":{"type":"string"},"eventStart":{"type":"string"}},"supports":{"html":false},"textdomain":"gatherpress","editorScript":"file:./index.js","style":"file:./style-index.css","render":"file:./render.php"}');(0,r.registerBlockType)(N,{edit:()=>{const e=(0,l.useBlockProps)(),[t,n]=(0,m.useState)(D),[r,o]=(0,m.useState)(y),[d,p]=(0,m.useState)(b());return((e,t="")=>{for(const[n,r]of Object.entries(e)){let e=n;t&&(e+="_"+String(t)),addEventListener(e,(e=>{r(e.detail)}),!1)}})({setDateTimeEnd:o,setDateTimeStart:n,setTimezone:p}),(0,a.createElement)("div",{...e},(0,a.createElement)(P,null,(0,a.createElement)(c.Flex,{justify:"normal",align:"flex-start",gap:"4"},(0,a.createElement)(c.FlexItem,{display:"flex",className:"gp-event-date__icon"},(0,a.createElement)(c.Icon,{icon:"clock"})),(0,a.createElement)(c.FlexItem,null,((e,t,n)=>{const r="dddd, MMMM D, YYYY",a="h:mm A",o=r+" "+a,l=b(n);let c=r+" "+a+" z";return s().tz(e,l).format(r)===s().tz(t,l).format(r)&&(c=a+" z"),(0,i.sprintf)(/* translators: %1$s: datetime start, %2$s: datetime end, %3$s timezone. */ +(()=>{"use strict";var e,t={3484:(e,t,n)=>{const r=window.wp.blocks,a=window.React,o=window.moment;var s=n.n(o);const i=window.wp.i18n,l=window.wp.blockEditor,c=window.wp.components,m=window.wp.element,d=(e,t="")=>{for(const[n,r]of Object.entries(e)){let e=n;t&&(e+="_"+String(t));const a=new CustomEvent(e,{detail:r});dispatchEvent(a)}},p=window.wp.data,u=window.wp.apiFetch;var v=n.n(u);function f(){(0,p.dispatch)("core/editor")?.editPost({meta:{_non_existing_meta:!0}})}function _(e){if("object"==typeof GatherPress)return e.split(".").reduce(((e,t)=>e&&e[t]),GatherPress)}function E(e,t){if("object"!=typeof GatherPress)return;const n=e.split("."),r=n.pop();n.reduce(((e,t)=>{var n;return null!==(n=e[t])&&void 0!==n?n:e[t]={}}),GatherPress)[r]=t}function g(){const e=s().tz(_("event_datetime.datetime_end"),b());return s().tz(b()).valueOf()>e.valueOf()}function h(){const e="gp_event_past",t=(0,p.dispatch)("core/notices");t.removeNotice(e),g()&&t.createNotice("warning",(0,i.__)("This event has already past.","gatherpress"),{id:e,isDismissible:!1})}const T="YYYY-MM-DDTHH:mm:ss",w="YYYY-MM-DD HH:mm:ss",z="MMMM D, YYYY h:mm a",b=(e=_("event_datetime.timezone"))=>s().tz.zone(e)?e:(0,i.__)("GMT","gatherpress"),S=(e="")=>{const t=/^([+-])(\d{2}):(00|15|30|45)$/,n=e.replace(t,"$1");return n!==e?"UTC"+n+parseInt(e.replace(t,"$2")).toString()+e.replace(t,"$3").replace("00","").replace("15",".25").replace("30",".5").replace("45",".75"):e},D=s().tz(b()).add(1,"day").set("hour",18).set("minute",0).set("second",0).format(T),y=s().tz(D,b()).add(2,"hours").format(T),O=(e,t=null)=>{!function(e){const t=s().tz(_("event_datetime.datetime_end"),b()).valueOf(),n=s().tz(e,b()).valueOf();if(n>=t){const e=s().tz(n,b()).add(2,"hours").format(T);k(e)}}(e),E("event_datetime.datetime_start",e),"function"==typeof t&&t(e),f()},k=(e,t=null)=>{!function(e){const t=s().tz(_("event_datetime.datetime_start"),b()).valueOf(),n=s().tz(e,b()).valueOf();if(n<=t){const e=s().tz(n,b()).subtract(2,"hours").format(T);O(e)}}(e),E("event_datetime.datetime_end",e),null!==t&&t(e),f()};function x(){const e=(0,p.select)("core/editor").isSavingPost(),t=(0,p.select)("core/editor").isAutosavingPost();"gp_event"===(0,p.select)("core/editor").getCurrentPostType()&&e&&!t&&v()({path:"/gatherpress/v1/event/datetime/",method:"POST",data:{post_id:_("post_id"),datetime_start:s().tz(_("event_datetime.datetime_start"),b()).format(w),datetime_end:s().tz(_("event_datetime.datetime_end"),b()).format(w),timezone:_("event_datetime.timezone"),_wpnonce:_("nonce")}}).then((()=>{!function(){const e="gp_event_communcation",t=(0,p.dispatch)("core/notices");t.removeNotice(e),"publish"!==(0,p.select)("core/editor").getEditedPostAttribute("status")||g()||t.createNotice("success",(0,i.__)("Send an event update to members via email?","gatherpress"),{id:e,isDismissible:!0,actions:[{onClick:()=>{d({setOpen:!0})},label:(0,i.__)("Compose Message","gatherpress")}]})}()}))}const P=e=>{const{isSelected:t}=e,n=t?"none":"block";return(0,a.createElement)("div",{style:{position:"relative"}},e.children,(0,a.createElement)("div",{style:{position:"absolute",top:"0",right:"0",bottom:"0",left:"0",display:n}}))},C=window.wp.date,M=e=>{const{dateTimeStart:t}=e;return s().tz(t,b()).format(z)},Y=e=>{const{dateTimeEnd:t}=e;return s().tz(t,b()).format(z)},j=e=>{const{dateTimeStart:t,setDateTimeStart:n}=e,r=(0,C.getSettings)(),o=/a(?!\\)/i.test(r.formats.time.toLowerCase().replace(/\\\\/g,"").split("").reverse().join(""));return(0,a.createElement)(c.DateTimePicker,{currentDate:t,onChange:e=>O(e,n),is12Hour:o})},$=e=>{const{dateTimeEnd:t,setDateTimeEnd:n}=e,r=(0,C.getSettings)(),o=/a(?!\\)/i.test(r.formats.time.toLowerCase().replace(/\\\\/g,"").split("").reverse().join(""));return(0,a.createElement)(c.DateTimePicker,{currentDate:t,onChange:e=>k(e,n),is12Hour:o})},F=e=>{const{dateTimeStart:t,setDateTimeStart:n}=e;return(0,m.useEffect)((()=>{n(s().tz((()=>{let e=_("event_datetime.datetime_start");return e=""!==e?s().tz(e,b()).format(T):D,E("event_datetime.datetime_start",e),e})(),b()).format(T)),d({setDateTimeStart:t}),h()})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.Flex,null,(0,a.createElement)(c.FlexItem,null,(0,i.__)("Start","gatherpress")),(0,a.createElement)(c.FlexItem,null,(0,a.createElement)(c.Dropdown,{popoverProps:{placement:"bottom-end"},renderToggle:({isOpen:e,onToggle:n})=>(0,a.createElement)(c.Button,{onClick:n,"aria-expanded":e,isLink:!0},(0,a.createElement)(M,{dateTimeStart:t})),renderContent:()=>(0,a.createElement)(j,{dateTimeStart:t,setDateTimeStart:n})}))))},I=e=>{const{dateTimeEnd:t,setDateTimeEnd:n}=e;return(0,m.useEffect)((()=>{n(s().tz((()=>{let e=_("event_datetime.datetime_end");return e=""!==e?s().tz(e,b()).format(T):y,E("event_datetime.datetime_end",e),e})(),b()).format(T)),d({setDateTimeEnd:t}),h()})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.Flex,null,(0,a.createElement)(c.FlexItem,null,(0,i.__)("End","gatherpress")),(0,a.createElement)(c.FlexItem,null,(0,a.createElement)(c.Dropdown,{popoverProps:{placement:"bottom-end"},renderToggle:({isOpen:e,onToggle:n})=>(0,a.createElement)(c.Button,{onClick:n,"aria-expanded":e,isLink:!0},(0,a.createElement)(Y,{dateTimeEnd:t})),renderContent:()=>(0,a.createElement)($,{dateTimeEnd:t,setDateTimeEnd:n})}))))},G=e=>{const{timezone:t,setTimezone:n}=e,r=_("timezone_choices");return(0,m.useEffect)((()=>{n(_("event_datetime.timezone"))}),[n]),(0,m.useEffect)((()=>{d({setTimezone:_("event_datetime.timezone")})})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.SelectControl,{label:(0,i.__)("Time Zone","gatherpress"),value:S(t),onChange:e=>{e=((e="")=>{const t=/^UTC([+-])(\d+)(.\d+)?$/,n=e.replace(t,"$1");if(n!==e){const r=e.replace(t,"$2").padStart(2,"0");let a=e.replace(t,"$3");return""===a&&(a=":00"),a=a.replace(".25",":15").replace(".5",":30").replace(".75",":45"),n+r+a}return e})(e),n(e),E("event_datetime.timezone",e),f()}},Object.keys(r).map((e=>(0,a.createElement)("optgroup",{key:e,label:e},Object.keys(r[e]).map((t=>(0,a.createElement)("option",{key:t,value:t},r[e][t]))))))))},H=()=>{const[e,t]=(0,m.useState)(),[n,r]=(0,m.useState)(),[o,s]=(0,m.useState)();return(0,p.subscribe)(x),(0,a.createElement)(a.Fragment,null,(0,a.createElement)("section",null,(0,a.createElement)("h3",null,(0,i.__)("Date & time","gatherpress")),(0,a.createElement)(F,{dateTimeStart:e,setDateTimeStart:t}),(0,a.createElement)(I,{dateTimeEnd:n,setDateTimeEnd:r})),(0,a.createElement)("section",null,(0,a.createElement)(G,{timezone:o,setTimezone:s})))},N=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":2,"name":"gatherpress/event-date","version":"1.0.0","title":"Event Date","category":"gatherpress","icon":"clock","example":{},"description":"Display and edit event dates.","attributes":{"eventEnd":{"type":"string"},"eventStart":{"type":"string"}},"supports":{"html":false},"textdomain":"gatherpress","editorScript":"file:./index.js","style":"file:./style-index.css","render":"file:./render.php"}');(0,r.registerBlockType)(N,{edit:()=>{const e=(0,l.useBlockProps)(),[t,n]=(0,m.useState)(D),[r,o]=(0,m.useState)(y),[d,p]=(0,m.useState)(b());return((e,t="")=>{for(const[n,r]of Object.entries(e)){let e=n;t&&(e+="_"+String(t)),addEventListener(e,(e=>{r(e.detail)}),!1)}})({setDateTimeEnd:o,setDateTimeStart:n,setTimezone:p}),(0,a.createElement)("div",{...e},(0,a.createElement)(P,null,(0,a.createElement)(c.Flex,{justify:"normal",align:"center",gap:"4"},(0,a.createElement)(c.FlexItem,{display:"flex",className:"gp-event-date__icon"},(0,a.createElement)(c.Icon,{icon:"clock"})),(0,a.createElement)(c.FlexItem,null,((e,t,n)=>{const r="dddd, MMMM D, YYYY",a="h:mm A",o=r+" "+a,l=b(n);let c=r+" "+a+" z";return s().tz(e,l).format(r)===s().tz(t,l).format(r)&&(c=a+" z"),(0,i.sprintf)(/* translators: %1$s: datetime start, %2$s: datetime end, %3$s timezone. */ (0,i.__)("%1$s to %2$s %3$s"),s().tz(e,l).format(o),s().tz(t,l).format(c),(e=>(e=b(e),(0,i.__)("GMT","gatherpress")!==e?"":((e="")=>e.replace(":",""))(_("event_datetime.timezone"))))(l))})(t,r,d)),(0,a.createElement)(l.InspectorControls,null,(0,a.createElement)(c.PanelBody,null,(0,a.createElement)(H,null))))))},save:()=>null})}},n={};function r(e){var a=n[e];if(void 0!==a)return a.exports;var o=n[e]={exports:{}};return t[e](o,o.exports,r),o.exports}r.m=t,e=[],r.O=(t,n,a,o)=>{if(!n){var s=1/0;for(m=0;m=o)&&Object.keys(r.O).every((e=>r.O[e](n[l])))?n.splice(l--,1):(i=!1,o0&&e[m-1][2]>o;m--)e[m]=e[m-1];e[m]=[n,a,o]},r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={591:0,42:0};r.O.j=t=>0===e[t];var t=(t,n)=>{var a,o,[s,i,l]=n,c=0;if(s.some((t=>0!==e[t]))){for(a in i)r.o(i,a)&&(r.m[a]=i[a]);if(l)var m=l(r)}for(t&&t(n);cr(3484)));a=r.O(a)})(); \ No newline at end of file diff --git a/includes/core/classes/class-assets.php b/includes/core/classes/class-assets.php index 79a4180ce..ce427f5b4 100644 --- a/includes/core/classes/class-assets.php +++ b/includes/core/classes/class-assets.php @@ -153,6 +153,8 @@ public function admin_enqueue_scripts( string $hook ): void { true ); + wp_set_script_translations( 'gatherpress-panels', 'gatherpress', GATHERPRESS_CORE_PATH . '/languages' ); + $asset = $this->get_asset_data( 'modals' ); wp_enqueue_script( 'gatherpress-modals', @@ -161,6 +163,8 @@ public function admin_enqueue_scripts( string $hook ): void { $asset['version'], true ); + + wp_set_script_translations( 'gatherpress-modals', 'gatherpress', GATHERPRESS_CORE_PATH . '/languages' ); } $settings = Settings::get_instance(); @@ -206,6 +210,8 @@ function( $key ) { $asset['version'], true ); + + wp_set_script_translations( 'gatherpress-admin', 'gatherpress', GATHERPRESS_CORE_PATH . '/languages' ); } /** @@ -228,6 +234,8 @@ public function editor_enqueue_scripts(): void { $asset['version'], true ); + + wp_set_script_translations( 'gatherpress-editor', 'gatherpress', GATHERPRESS_CORE_PATH . '/languages' ); } /** diff --git a/includes/core/classes/class-block.php b/includes/core/classes/class-block.php index 91f4f5a80..0594fdf2d 100644 --- a/includes/core/classes/class-block.php +++ b/includes/core/classes/class-block.php @@ -46,7 +46,8 @@ protected function __construct() { * @return void */ protected function setup_hooks(): void { - add_action( 'init', array( $this, 'register_blocks' ) ); + // Priority 11 needed for block.json translations of title and description. + add_action( 'init', array( $this, 'register_blocks' ), 11 ); add_filter( 'load_script_translation_file', array( $this, 'fix_translation_location' ), 10, 3 ); } diff --git a/src/blocks/add-to-calendar/edit.js b/src/blocks/add-to-calendar/edit.js index 56487fea0..3f276f05d 100644 --- a/src/blocks/add-to-calendar/edit.js +++ b/src/blocks/add-to-calendar/edit.js @@ -16,7 +16,7 @@ const Edit = () => { return (
- + diff --git a/src/blocks/event-date/edit.js b/src/blocks/event-date/edit.js index ae700b294..a94e53189 100644 --- a/src/blocks/event-date/edit.js +++ b/src/blocks/event-date/edit.js @@ -67,7 +67,7 @@ const Edit = () => { return (
- + diff --git a/test/unit/php/includes/core/classes/class-test-block.php b/test/unit/php/includes/core/classes/class-test-block.php index 36a017d2d..2b69b6a9b 100644 --- a/test/unit/php/includes/core/classes/class-test-block.php +++ b/test/unit/php/includes/core/classes/class-test-block.php @@ -34,7 +34,7 @@ public function test_setup_hooks(): void { array( 'type' => 'action', 'name' => 'init', - 'priority' => 10, + 'priority' => 11, 'callback' => array( $instance, 'register_blocks' ), ), array( From 94f9a859b60f14d2225d1b51ce2696aa26b5706e Mon Sep 17 00:00:00 2001 From: Mike Auteri Date: Sat, 6 Jan 2024 14:42:59 -0500 Subject: [PATCH 3/3] Updated block to display correct datetime format from GatherPress settings. --- build/blocks/event-date/index.asset.php | 2 +- build/blocks/event-date/index.js | 4 +- includes/core/classes/class-assets.php | 4 +- src/blocks/event-date/edit.js | 12 +++-- src/helpers/datetime.js | 60 +++++++++++++++++++++++ test/unit/js/src/helpers/datetime.test.js | 16 ++++++ 6 files changed, 91 insertions(+), 7 deletions(-) diff --git a/build/blocks/event-date/index.asset.php b/build/blocks/event-date/index.asset.php index 5646d6f29..e9b3131f4 100644 --- a/build/blocks/event-date/index.asset.php +++ b/build/blocks/event-date/index.asset.php @@ -1 +1 @@ - array('moment', 'react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-date', 'wp-element', 'wp-i18n'), 'version' => 'f3ff15c2dc0e1c16a3d7'); + array('moment', 'react', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-data', 'wp-date', 'wp-element', 'wp-i18n'), 'version' => '083cc7b917e8e9e4ec2e'); diff --git a/build/blocks/event-date/index.js b/build/blocks/event-date/index.js index fd3d19567..184d4a70a 100644 --- a/build/blocks/event-date/index.js +++ b/build/blocks/event-date/index.js @@ -1,2 +1,2 @@ -(()=>{"use strict";var e,t={3484:(e,t,n)=>{const r=window.wp.blocks,a=window.React,o=window.moment;var s=n.n(o);const i=window.wp.i18n,l=window.wp.blockEditor,c=window.wp.components,m=window.wp.element,d=(e,t="")=>{for(const[n,r]of Object.entries(e)){let e=n;t&&(e+="_"+String(t));const a=new CustomEvent(e,{detail:r});dispatchEvent(a)}},p=window.wp.data,u=window.wp.apiFetch;var v=n.n(u);function f(){(0,p.dispatch)("core/editor")?.editPost({meta:{_non_existing_meta:!0}})}function _(e){if("object"==typeof GatherPress)return e.split(".").reduce(((e,t)=>e&&e[t]),GatherPress)}function E(e,t){if("object"!=typeof GatherPress)return;const n=e.split("."),r=n.pop();n.reduce(((e,t)=>{var n;return null!==(n=e[t])&&void 0!==n?n:e[t]={}}),GatherPress)[r]=t}function g(){const e=s().tz(_("event_datetime.datetime_end"),b());return s().tz(b()).valueOf()>e.valueOf()}function h(){const e="gp_event_past",t=(0,p.dispatch)("core/notices");t.removeNotice(e),g()&&t.createNotice("warning",(0,i.__)("This event has already past.","gatherpress"),{id:e,isDismissible:!1})}const T="YYYY-MM-DDTHH:mm:ss",w="YYYY-MM-DD HH:mm:ss",z="MMMM D, YYYY h:mm a",b=(e=_("event_datetime.timezone"))=>s().tz.zone(e)?e:(0,i.__)("GMT","gatherpress"),S=(e="")=>{const t=/^([+-])(\d{2}):(00|15|30|45)$/,n=e.replace(t,"$1");return n!==e?"UTC"+n+parseInt(e.replace(t,"$2")).toString()+e.replace(t,"$3").replace("00","").replace("15",".25").replace("30",".5").replace("45",".75"):e},D=s().tz(b()).add(1,"day").set("hour",18).set("minute",0).set("second",0).format(T),y=s().tz(D,b()).add(2,"hours").format(T),O=(e,t=null)=>{!function(e){const t=s().tz(_("event_datetime.datetime_end"),b()).valueOf(),n=s().tz(e,b()).valueOf();if(n>=t){const e=s().tz(n,b()).add(2,"hours").format(T);k(e)}}(e),E("event_datetime.datetime_start",e),"function"==typeof t&&t(e),f()},k=(e,t=null)=>{!function(e){const t=s().tz(_("event_datetime.datetime_start"),b()).valueOf(),n=s().tz(e,b()).valueOf();if(n<=t){const e=s().tz(n,b()).subtract(2,"hours").format(T);O(e)}}(e),E("event_datetime.datetime_end",e),null!==t&&t(e),f()};function x(){const e=(0,p.select)("core/editor").isSavingPost(),t=(0,p.select)("core/editor").isAutosavingPost();"gp_event"===(0,p.select)("core/editor").getCurrentPostType()&&e&&!t&&v()({path:"/gatherpress/v1/event/datetime/",method:"POST",data:{post_id:_("post_id"),datetime_start:s().tz(_("event_datetime.datetime_start"),b()).format(w),datetime_end:s().tz(_("event_datetime.datetime_end"),b()).format(w),timezone:_("event_datetime.timezone"),_wpnonce:_("nonce")}}).then((()=>{!function(){const e="gp_event_communcation",t=(0,p.dispatch)("core/notices");t.removeNotice(e),"publish"!==(0,p.select)("core/editor").getEditedPostAttribute("status")||g()||t.createNotice("success",(0,i.__)("Send an event update to members via email?","gatherpress"),{id:e,isDismissible:!0,actions:[{onClick:()=>{d({setOpen:!0})},label:(0,i.__)("Compose Message","gatherpress")}]})}()}))}const P=e=>{const{isSelected:t}=e,n=t?"none":"block";return(0,a.createElement)("div",{style:{position:"relative"}},e.children,(0,a.createElement)("div",{style:{position:"absolute",top:"0",right:"0",bottom:"0",left:"0",display:n}}))},C=window.wp.date,M=e=>{const{dateTimeStart:t}=e;return s().tz(t,b()).format(z)},Y=e=>{const{dateTimeEnd:t}=e;return s().tz(t,b()).format(z)},j=e=>{const{dateTimeStart:t,setDateTimeStart:n}=e,r=(0,C.getSettings)(),o=/a(?!\\)/i.test(r.formats.time.toLowerCase().replace(/\\\\/g,"").split("").reverse().join(""));return(0,a.createElement)(c.DateTimePicker,{currentDate:t,onChange:e=>O(e,n),is12Hour:o})},$=e=>{const{dateTimeEnd:t,setDateTimeEnd:n}=e,r=(0,C.getSettings)(),o=/a(?!\\)/i.test(r.formats.time.toLowerCase().replace(/\\\\/g,"").split("").reverse().join(""));return(0,a.createElement)(c.DateTimePicker,{currentDate:t,onChange:e=>k(e,n),is12Hour:o})},F=e=>{const{dateTimeStart:t,setDateTimeStart:n}=e;return(0,m.useEffect)((()=>{n(s().tz((()=>{let e=_("event_datetime.datetime_start");return e=""!==e?s().tz(e,b()).format(T):D,E("event_datetime.datetime_start",e),e})(),b()).format(T)),d({setDateTimeStart:t}),h()})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.Flex,null,(0,a.createElement)(c.FlexItem,null,(0,i.__)("Start","gatherpress")),(0,a.createElement)(c.FlexItem,null,(0,a.createElement)(c.Dropdown,{popoverProps:{placement:"bottom-end"},renderToggle:({isOpen:e,onToggle:n})=>(0,a.createElement)(c.Button,{onClick:n,"aria-expanded":e,isLink:!0},(0,a.createElement)(M,{dateTimeStart:t})),renderContent:()=>(0,a.createElement)(j,{dateTimeStart:t,setDateTimeStart:n})}))))},I=e=>{const{dateTimeEnd:t,setDateTimeEnd:n}=e;return(0,m.useEffect)((()=>{n(s().tz((()=>{let e=_("event_datetime.datetime_end");return e=""!==e?s().tz(e,b()).format(T):y,E("event_datetime.datetime_end",e),e})(),b()).format(T)),d({setDateTimeEnd:t}),h()})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.Flex,null,(0,a.createElement)(c.FlexItem,null,(0,i.__)("End","gatherpress")),(0,a.createElement)(c.FlexItem,null,(0,a.createElement)(c.Dropdown,{popoverProps:{placement:"bottom-end"},renderToggle:({isOpen:e,onToggle:n})=>(0,a.createElement)(c.Button,{onClick:n,"aria-expanded":e,isLink:!0},(0,a.createElement)(Y,{dateTimeEnd:t})),renderContent:()=>(0,a.createElement)($,{dateTimeEnd:t,setDateTimeEnd:n})}))))},G=e=>{const{timezone:t,setTimezone:n}=e,r=_("timezone_choices");return(0,m.useEffect)((()=>{n(_("event_datetime.timezone"))}),[n]),(0,m.useEffect)((()=>{d({setTimezone:_("event_datetime.timezone")})})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.SelectControl,{label:(0,i.__)("Time Zone","gatherpress"),value:S(t),onChange:e=>{e=((e="")=>{const t=/^UTC([+-])(\d+)(.\d+)?$/,n=e.replace(t,"$1");if(n!==e){const r=e.replace(t,"$2").padStart(2,"0");let a=e.replace(t,"$3");return""===a&&(a=":00"),a=a.replace(".25",":15").replace(".5",":30").replace(".75",":45"),n+r+a}return e})(e),n(e),E("event_datetime.timezone",e),f()}},Object.keys(r).map((e=>(0,a.createElement)("optgroup",{key:e,label:e},Object.keys(r[e]).map((t=>(0,a.createElement)("option",{key:t,value:t},r[e][t]))))))))},H=()=>{const[e,t]=(0,m.useState)(),[n,r]=(0,m.useState)(),[o,s]=(0,m.useState)();return(0,p.subscribe)(x),(0,a.createElement)(a.Fragment,null,(0,a.createElement)("section",null,(0,a.createElement)("h3",null,(0,i.__)("Date & time","gatherpress")),(0,a.createElement)(F,{dateTimeStart:e,setDateTimeStart:t}),(0,a.createElement)(I,{dateTimeEnd:n,setDateTimeEnd:r})),(0,a.createElement)("section",null,(0,a.createElement)(G,{timezone:o,setTimezone:s})))},N=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":2,"name":"gatherpress/event-date","version":"1.0.0","title":"Event Date","category":"gatherpress","icon":"clock","example":{},"description":"Display and edit event dates.","attributes":{"eventEnd":{"type":"string"},"eventStart":{"type":"string"}},"supports":{"html":false},"textdomain":"gatherpress","editorScript":"file:./index.js","style":"file:./style-index.css","render":"file:./render.php"}');(0,r.registerBlockType)(N,{edit:()=>{const e=(0,l.useBlockProps)(),[t,n]=(0,m.useState)(D),[r,o]=(0,m.useState)(y),[d,p]=(0,m.useState)(b());return((e,t="")=>{for(const[n,r]of Object.entries(e)){let e=n;t&&(e+="_"+String(t)),addEventListener(e,(e=>{r(e.detail)}),!1)}})({setDateTimeEnd:o,setDateTimeStart:n,setTimezone:p}),(0,a.createElement)("div",{...e},(0,a.createElement)(P,null,(0,a.createElement)(c.Flex,{justify:"normal",align:"center",gap:"4"},(0,a.createElement)(c.FlexItem,{display:"flex",className:"gp-event-date__icon"},(0,a.createElement)(c.Icon,{icon:"clock"})),(0,a.createElement)(c.FlexItem,null,((e,t,n)=>{const r="dddd, MMMM D, YYYY",a="h:mm A",o=r+" "+a,l=b(n);let c=r+" "+a+" z";return s().tz(e,l).format(r)===s().tz(t,l).format(r)&&(c=a+" z"),(0,i.sprintf)(/* translators: %1$s: datetime start, %2$s: datetime end, %3$s timezone. */ -(0,i.__)("%1$s to %2$s %3$s"),s().tz(e,l).format(o),s().tz(t,l).format(c),(e=>(e=b(e),(0,i.__)("GMT","gatherpress")!==e?"":((e="")=>e.replace(":",""))(_("event_datetime.timezone"))))(l))})(t,r,d)),(0,a.createElement)(l.InspectorControls,null,(0,a.createElement)(c.PanelBody,null,(0,a.createElement)(H,null))))))},save:()=>null})}},n={};function r(e){var a=n[e];if(void 0!==a)return a.exports;var o=n[e]={exports:{}};return t[e](o,o.exports,r),o.exports}r.m=t,e=[],r.O=(t,n,a,o)=>{if(!n){var s=1/0;for(m=0;m=o)&&Object.keys(r.O).every((e=>r.O[e](n[l])))?n.splice(l--,1):(i=!1,o0&&e[m-1][2]>o;m--)e[m]=e[m-1];e[m]=[n,a,o]},r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={591:0,42:0};r.O.j=t=>0===e[t];var t=(t,n)=>{var a,o,[s,i,l]=n,c=0;if(s.some((t=>0!==e[t]))){for(a in i)r.o(i,a)&&(r.m[a]=i[a]);if(l)var m=l(r)}for(t&&t(n);cr(3484)));a=r.O(a)})(); \ No newline at end of file +(()=>{"use strict";var e,t={3484:(e,t,n)=>{const r=window.wp.blocks,a=window.React,o=window.moment;var s=n.n(o);const i=window.wp.i18n,l=window.wp.blockEditor,c=window.wp.components,m=window.wp.element,d=(e,t="")=>{for(const[n,r]of Object.entries(e)){let e=n;t&&(e+="_"+String(t));const a=new CustomEvent(e,{detail:r});dispatchEvent(a)}},p=window.wp.data,u=window.wp.apiFetch;var f=n.n(u);function v(){(0,p.dispatch)("core/editor")?.editPost({meta:{_non_existing_meta:!0}})}function _(e){if("object"==typeof GatherPress)return e.split(".").reduce(((e,t)=>e&&e[t]),GatherPress)}function g(e,t){if("object"!=typeof GatherPress)return;const n=e.split("."),r=n.pop();n.reduce(((e,t)=>{var n;return null!==(n=e[t])&&void 0!==n?n:e[t]={}}),GatherPress)[r]=t}function E(){const e=s().tz(_("event_datetime.datetime_end"),b());return s().tz(b()).valueOf()>e.valueOf()}function h(){const e="gp_event_past",t=(0,p.dispatch)("core/notices");t.removeNotice(e),E()&&t.createNotice("warning",(0,i.__)("This event has already past.","gatherpress"),{id:e,isDismissible:!1})}const T="YYYY-MM-DDTHH:mm:ss",w="YYYY-MM-DD HH:mm:ss",z="MMMM D, YYYY h:mm a",b=(e=_("event_datetime.timezone"))=>s().tz.zone(e)?e:(0,i.__)("GMT","gatherpress"),S=(e="")=>{const t=/^([+-])(\d{2}):(00|15|30|45)$/,n=e.replace(t,"$1");return n!==e?"UTC"+n+parseInt(e.replace(t,"$2")).toString()+e.replace(t,"$3").replace("00","").replace("15",".25").replace("30",".5").replace("45",".75"):e},D=s().tz(b()).add(1,"day").set("hour",18).set("minute",0).set("second",0).format(T),y=s().tz(D,b()).add(2,"hours").format(T),O=(e,t=null)=>{!function(e){const t=s().tz(_("event_datetime.datetime_end"),b()).valueOf(),n=s().tz(e,b()).valueOf();if(n>=t){const e=s().tz(n,b()).add(2,"hours").format(T);k(e)}}(e),g("event_datetime.datetime_start",e),"function"==typeof t&&t(e),v()},k=(e,t=null)=>{!function(e){const t=s().tz(_("event_datetime.datetime_start"),b()).valueOf(),n=s().tz(e,b()).valueOf();if(n<=t){const e=s().tz(n,b()).subtract(2,"hours").format(T);O(e)}}(e),g("event_datetime.datetime_end",e),null!==t&&t(e),v()};function M(){const e=(0,p.select)("core/editor").isSavingPost(),t=(0,p.select)("core/editor").isAutosavingPost();"gp_event"===(0,p.select)("core/editor").getCurrentPostType()&&e&&!t&&f()({path:"/gatherpress/v1/event/datetime/",method:"POST",data:{post_id:_("post_id"),datetime_start:s().tz(_("event_datetime.datetime_start"),b()).format(w),datetime_end:s().tz(_("event_datetime.datetime_end"),b()).format(w),timezone:_("event_datetime.timezone"),_wpnonce:_("nonce")}}).then((()=>{!function(){const e="gp_event_communcation",t=(0,p.dispatch)("core/notices");t.removeNotice(e),"publish"!==(0,p.select)("core/editor").getEditedPostAttribute("status")||E()||t.createNotice("success",(0,i.__)("Send an event update to members via email?","gatherpress"),{id:e,isDismissible:!0,actions:[{onClick:()=>{d({setOpen:!0})},label:(0,i.__)("Compose Message","gatherpress")}]})}()}))}function Y(e){const t={d:"DD",D:"ddd",j:"D",l:"dddd",N:"E",S:"o",w:"e",z:"DDD",W:"W",F:"MMMM",m:"MM",M:"MMM",n:"M",t:"",L:"",o:"YYYY",Y:"YYYY",y:"YY",a:"a",A:"A",B:"",g:"h",G:"H",h:"hh",H:"HH",i:"mm",s:"ss",u:"SSS",e:"zz",I:"",O:"",P:"",T:"",Z:"",c:"",r:"",U:"X"};return e.split("").map((e=>e in t?t[e]:e)).join("")}const P=e=>{const{isSelected:t}=e,n=t?"none":"block";return(0,a.createElement)("div",{style:{position:"relative"}},e.children,(0,a.createElement)("div",{style:{position:"absolute",top:"0",right:"0",bottom:"0",left:"0",display:n}}))},x=window.wp.date,C=e=>{const{dateTimeStart:t}=e;return s().tz(t,b()).format(z)},j=e=>{const{dateTimeEnd:t}=e;return s().tz(t,b()).format(z)},F=e=>{const{dateTimeStart:t,setDateTimeStart:n}=e,r=(0,x.getSettings)(),o=/a(?!\\)/i.test(r.formats.time.toLowerCase().replace(/\\\\/g,"").split("").reverse().join(""));return(0,a.createElement)(c.DateTimePicker,{currentDate:t,onChange:e=>O(e,n),is12Hour:o})},$=e=>{const{dateTimeEnd:t,setDateTimeEnd:n}=e,r=(0,x.getSettings)(),o=/a(?!\\)/i.test(r.formats.time.toLowerCase().replace(/\\\\/g,"").split("").reverse().join(""));return(0,a.createElement)(c.DateTimePicker,{currentDate:t,onChange:e=>k(e,n),is12Hour:o})},H=e=>{const{dateTimeStart:t,setDateTimeStart:n}=e;return(0,m.useEffect)((()=>{n(s().tz((()=>{let e=_("event_datetime.datetime_start");return e=""!==e?s().tz(e,b()).format(T):D,g("event_datetime.datetime_start",e),e})(),b()).format(T)),d({setDateTimeStart:t}),h()})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.Flex,null,(0,a.createElement)(c.FlexItem,null,(0,i.__)("Start","gatherpress")),(0,a.createElement)(c.FlexItem,null,(0,a.createElement)(c.Dropdown,{popoverProps:{placement:"bottom-end"},renderToggle:({isOpen:e,onToggle:n})=>(0,a.createElement)(c.Button,{onClick:n,"aria-expanded":e,isLink:!0},(0,a.createElement)(C,{dateTimeStart:t})),renderContent:()=>(0,a.createElement)(F,{dateTimeStart:t,setDateTimeStart:n})}))))},I=e=>{const{dateTimeEnd:t,setDateTimeEnd:n}=e;return(0,m.useEffect)((()=>{n(s().tz((()=>{let e=_("event_datetime.datetime_end");return e=""!==e?s().tz(e,b()).format(T):y,g("event_datetime.datetime_end",e),e})(),b()).format(T)),d({setDateTimeEnd:t}),h()})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.Flex,null,(0,a.createElement)(c.FlexItem,null,(0,i.__)("End","gatherpress")),(0,a.createElement)(c.FlexItem,null,(0,a.createElement)(c.Dropdown,{popoverProps:{placement:"bottom-end"},renderToggle:({isOpen:e,onToggle:n})=>(0,a.createElement)(c.Button,{onClick:n,"aria-expanded":e,isLink:!0},(0,a.createElement)(j,{dateTimeEnd:t})),renderContent:()=>(0,a.createElement)($,{dateTimeEnd:t,setDateTimeEnd:n})}))))},G=e=>{const{timezone:t,setTimezone:n}=e,r=_("timezone_choices");return(0,m.useEffect)((()=>{n(_("event_datetime.timezone"))}),[n]),(0,m.useEffect)((()=>{d({setTimezone:_("event_datetime.timezone")})})),(0,a.createElement)(c.PanelRow,null,(0,a.createElement)(c.SelectControl,{label:(0,i.__)("Time Zone","gatherpress"),value:S(t),onChange:e=>{e=((e="")=>{const t=/^UTC([+-])(\d+)(.\d+)?$/,n=e.replace(t,"$1");if(n!==e){const r=e.replace(t,"$2").padStart(2,"0");let a=e.replace(t,"$3");return""===a&&(a=":00"),a=a.replace(".25",":15").replace(".5",":30").replace(".75",":45"),n+r+a}return e})(e),n(e),g("event_datetime.timezone",e),v()}},Object.keys(r).map((e=>(0,a.createElement)("optgroup",{key:e,label:e},Object.keys(r[e]).map((t=>(0,a.createElement)("option",{key:t,value:t},r[e][t]))))))))},N=()=>{const[e,t]=(0,m.useState)(),[n,r]=(0,m.useState)(),[o,s]=(0,m.useState)();return(0,p.subscribe)(M),(0,a.createElement)(a.Fragment,null,(0,a.createElement)("section",null,(0,a.createElement)("h3",null,(0,i.__)("Date & time","gatherpress")),(0,a.createElement)(H,{dateTimeStart:e,setDateTimeStart:t}),(0,a.createElement)(I,{dateTimeEnd:n,setDateTimeEnd:r})),(0,a.createElement)("section",null,(0,a.createElement)(G,{timezone:o,setTimezone:s})))},B=JSON.parse('{"$schema":"https://schemas.wp.org/trunk/block.json","apiVersion":2,"name":"gatherpress/event-date","version":"1.0.0","title":"Event Date","category":"gatherpress","icon":"clock","example":{},"description":"Display and edit event dates.","attributes":{"eventEnd":{"type":"string"},"eventStart":{"type":"string"}},"supports":{"html":false},"textdomain":"gatherpress","editorScript":"file:./index.js","style":"file:./style-index.css","render":"file:./render.php"}');(0,r.registerBlockType)(B,{edit:()=>{const e=(0,l.useBlockProps)(),[t,n]=(0,m.useState)(D),[r,o]=(0,m.useState)(y),[d,p]=(0,m.useState)(b());return((e,t="")=>{for(const[n,r]of Object.entries(e)){let e=n;t&&(e+="_"+String(t)),addEventListener(e,(e=>{r(e.detail)}),!1)}})({setDateTimeEnd:o,setDateTimeStart:n,setTimezone:p}),(0,a.createElement)("div",{...e},(0,a.createElement)(P,null,(0,a.createElement)(c.Flex,{justify:"normal",align:"center",gap:"4"},(0,a.createElement)(c.FlexItem,{display:"flex",className:"gp-event-date__icon"},(0,a.createElement)(c.Icon,{icon:"clock"})),(0,a.createElement)(c.FlexItem,null,((e,t,n)=>{const r=Y(_("settings.date_format")),a=Y(_("settings.time_format")),o=_("settings.show_timezone")?"z":"",l=r+" "+a,c=b(n);let m=r+" "+a+" "+o;return s().tz(e,c).format(r)===s().tz(t,c).format(r)&&(m=a+" "+o),(0,i.sprintf)(/* translators: %1$s: datetime start, %2$s: datetime end, %3$s timezone. */ +(0,i.__)("%1$s to %2$s %3$s"),s().tz(e,c).format(l),s().tz(t,c).format(m),(e=>(e=b(e),(0,i.__)("GMT","gatherpress")!==e?"":((e="")=>e.replace(":",""))(_("event_datetime.timezone"))))(c))})(t,r,d)),(0,a.createElement)(l.InspectorControls,null,(0,a.createElement)(c.PanelBody,null,(0,a.createElement)(N,null))))))},save:()=>null})}},n={};function r(e){var a=n[e];if(void 0!==a)return a.exports;var o=n[e]={exports:{}};return t[e](o,o.exports,r),o.exports}r.m=t,e=[],r.O=(t,n,a,o)=>{if(!n){var s=1/0;for(m=0;m=o)&&Object.keys(r.O).every((e=>r.O[e](n[l])))?n.splice(l--,1):(i=!1,o0&&e[m-1][2]>o;m--)e[m]=e[m-1];e[m]=[n,a,o]},r.n=e=>{var t=e&&e.__esModule?()=>e.default:()=>e;return r.d(t,{a:t}),t},r.d=(e,t)=>{for(var n in t)r.o(t,n)&&!r.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:t[n]})},r.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),(()=>{var e={591:0,42:0};r.O.j=t=>0===e[t];var t=(t,n)=>{var a,o,[s,i,l]=n,c=0;if(s.some((t=>0!==e[t]))){for(a in i)r.o(i,a)&&(r.m[a]=i[a]);if(l)var m=l(r)}for(t&&t(n);cr(3484)));a=r.O(a)})(); \ No newline at end of file diff --git a/includes/core/classes/class-assets.php b/includes/core/classes/class-assets.php index ce427f5b4..85b43948b 100644 --- a/includes/core/classes/class-assets.php +++ b/includes/core/classes/class-assets.php @@ -286,7 +286,9 @@ protected function localize( int $post_id ): array { 'post_id' => $post_id, 'post_type' => Event::POST_TYPE, 'settings' => array( - // @todo settings to come... + 'date_format' => $settings->get_value( 'general', 'formatting', 'date_format' ), + 'time_format' => $settings->get_value( 'general', 'formatting', 'time_format' ), + 'show_timezone' => ( '1' === $settings->get_value( 'general', 'formatting', 'show_timezone' ) ), ), 'login_url' => $this->get_login_url( $post_id ), 'registration_url' => $this->get_registration_url( $post_id ), diff --git a/src/blocks/event-date/edit.js b/src/blocks/event-date/edit.js index a94e53189..a61dff3f8 100644 --- a/src/blocks/event-date/edit.js +++ b/src/blocks/event-date/edit.js @@ -16,6 +16,7 @@ import { useState } from '@wordpress/element'; */ import { Listener } from '../../helpers/broadcasting'; import { + convertPHPToMomentFormat, defaultDateTimeEnd, defaultDateTimeStart, getTimeZone, @@ -23,6 +24,7 @@ import { } from '../../helpers/datetime'; import EditCover from '../../components/EditCover'; import DateTimeRange from '../../components/DateTimeRange'; +import { getFromGlobal } from '../../helpers/globals'; /** * Similar to get_display_datetime method in class-event.php. @@ -33,9 +35,13 @@ import DateTimeRange from '../../components/DateTimeRange'; * @return {string} Displayed date. */ const displayDateTime = (start, end, tz) => { - const dateFormat = 'dddd, MMMM D, YYYY'; - const timeFormat = 'h:mm A'; - const timeZoneFormat = 'z'; + const dateFormat = convertPHPToMomentFormat( + getFromGlobal('settings.date_format') + ); + const timeFormat = convertPHPToMomentFormat( + getFromGlobal('settings.time_format') + ); + const timeZoneFormat = getFromGlobal('settings.show_timezone') ? 'z' : ''; const startFormat = dateFormat + ' ' + timeFormat; const timeZone = getTimeZone(tz); let endFormat = dateFormat + ' ' + timeFormat + ' ' + timeZoneFormat; diff --git a/src/helpers/datetime.js b/src/helpers/datetime.js index 9f617faa1..d45a7bc3c 100644 --- a/src/helpers/datetime.js +++ b/src/helpers/datetime.js @@ -311,3 +311,63 @@ export function saveDateTime() { }); } } + +/** + * Convert PHP date format to Moment.js date format. + * + * This function converts a PHP date format string to its equivalent Moment.js date format. + * It uses a mapping of PHP format characters to Moment.js format characters. + * + * @see https://gist.github.com/neilrackett/7881b5bef4cb4ae63af5c3a6a244cffa + * + * @since 1.0.0 + * + * @param {string} format - The PHP date format to be converted. + * @return {string} The equivalent Moment.js date format. + */ +export function convertPHPToMomentFormat(format) { + const replacements = { + d: 'DD', + D: 'ddd', + j: 'D', + l: 'dddd', + N: 'E', + S: 'o', + w: 'e', + z: 'DDD', + W: 'W', + F: 'MMMM', + m: 'MM', + M: 'MMM', + n: 'M', + t: '', // no equivalent + L: '', // no equivalent + o: 'YYYY', + Y: 'YYYY', + y: 'YY', + a: 'a', + A: 'A', + B: '', // no equivalent + g: 'h', + G: 'H', + h: 'hh', + H: 'HH', + i: 'mm', + s: 'ss', + u: 'SSS', + e: 'zz', // deprecated since Moment.js 1.6.0 + I: '', // no equivalent + O: '', // no equivalent + P: '', // no equivalent + T: '', // no equivalent + Z: '', // no equivalent + c: '', // no equivalent + r: '', // no equivalent + U: 'X', + }; + + return format + .split('') + .map((chr) => (chr in replacements ? replacements[chr] : chr)) + .join(''); +} diff --git a/test/unit/js/src/helpers/datetime.test.js b/test/unit/js/src/helpers/datetime.test.js index 3d61a3c7d..b102849c6 100644 --- a/test/unit/js/src/helpers/datetime.test.js +++ b/test/unit/js/src/helpers/datetime.test.js @@ -8,6 +8,7 @@ import 'moment-timezone'; * Internal dependencies. */ import { + convertPHPToMomentFormat, defaultDateTimeEnd, defaultDateTimeStart, getDateTimeEnd, @@ -237,3 +238,18 @@ test('updateDateTimeEnd without second argument', () => { expect(global.GatherPress.event_datetime.datetime_end).toBe(date); }); + +/** + * Coverage for convertPHPToMomentFormat. + */ +test('convertPHPToMomentFormat returns correct date format', () => { + const format = convertPHPToMomentFormat('F j, Y'); + + expect(format).toBe('MMMM D, YYYY'); +}); + +test('convertPHPToMomentFormat returns correct time format', () => { + const format = convertPHPToMomentFormat('g:i a'); + + expect(format).toBe('h:mm a'); +});