From 037e4d3071e8f6f0b36b075b5bf6e88e6b73c8be Mon Sep 17 00:00:00 2001 From: Bernhard Schmitt Date: Thu, 15 Apr 2021 17:54:46 +0200 Subject: [PATCH] Add documentation --- Documentation/00_Index.md | 3 ++ Documentation/01_UserInterface.md | 58 +++++++++++++++++++++ Documentation/02_BuildingBlocks.md | 67 +++++++++++++++++++++++++ Documentation/03_CustomTasks.md | 60 ++++++++++++++++++++++ Documentation/inspector.png | Bin 0 -> 20556 bytes Documentation/module.png | Bin 0 -> 30000 bytes {Docs => Documentation}/screenshot.png | Bin README.md | 25 ++++++++- 8 files changed, 211 insertions(+), 2 deletions(-) create mode 100644 Documentation/00_Index.md create mode 100644 Documentation/01_UserInterface.md create mode 100644 Documentation/02_BuildingBlocks.md create mode 100644 Documentation/03_CustomTasks.md create mode 100644 Documentation/inspector.png create mode 100644 Documentation/module.png rename {Docs => Documentation}/screenshot.png (100%) diff --git a/Documentation/00_Index.md b/Documentation/00_Index.md new file mode 100644 index 0000000..46ae39c --- /dev/null +++ b/Documentation/00_Index.md @@ -0,0 +1,3 @@ +1. [User Interface](./Documentation/01_UserInterface.md) +2. [Building Blocks: Objects, Agents and Tasks](./Documentation/02_BuildingBlocks.md) +2. [Writing Custom Tasks](./Documentation/03_CustomTasks.md) diff --git a/Documentation/01_UserInterface.md b/Documentation/01_UserInterface.md new file mode 100644 index 0000000..daae443 --- /dev/null +++ b/Documentation/01_UserInterface.md @@ -0,0 +1,58 @@ +
+ Index +    |    + 2. Building Blocks > +
+ +--- + +# 1. The User Interface + +Bitzer comes with several user interface components: +1. Mixin node types to assign agents or intervals for automatic task creation +2. The task reminder overlay on login into the backend +3. The task overview module for editors to keep track of their work +4. The task management module for administrators to manage task lifecycles + +> Hint: Additionally, there is a command controller available for task handling. +> See ./flow help | grep bitzer + +## Scheduling tasks + +> Hint: For concrete examples, please see https://github.com/sitegeist/bitzer-review + +The default way of scheduling tasks is to configure a node type to use one of Bitzer's mixins. +This way, individual nodes can be assigned to agents to perform tasks like review or translation +in a certain interval. + +![Screenshot of Inspector Editor](inspector.png) + +Which tasks are to be scheduled is up to the concrete task implementations that Bitzer itself is the framework for. + +## The Task Reminder + +Upon login to the Neos backend, if there are scheduled tasks for the current user (as actor), +an overlay is displayed that shows the open tasks and links to the task management module. + +![Screenshot of task reminder](screenshot.png) + +The most important function of PresentationObjects is to enforce the interface between domain and presentation layer. + +For a single component that interface is represented by an actual PHP interface. So let's start with that: + +## The Task Management Module + +All tasks to be performed are listed in the task management module. +Here they can either be started or marked as complete. What happens when starting a task +is up to the concrete task's implementation. A review task might just open the node for review +while a translate task might create a variant of the node and display it. + +![Screenshot of task management module](module.png) + +--- + +
+ Index +    |    + 2. Building Blocks > +
diff --git a/Documentation/02_BuildingBlocks.md b/Documentation/02_BuildingBlocks.md new file mode 100644 index 0000000..b21b179 --- /dev/null +++ b/Documentation/02_BuildingBlocks.md @@ -0,0 +1,67 @@ +
+< 1. User Interface +    |    + Index +    |    + 2. Writing custom tasks > +
+ +--- + +# 2. Building Blocks + +The Bitzer building blocks are modeled using schema.org. The main entities are +* Object (refers to a content repository node by its address) +* Agent (can be a user or user group) +* Task (https://schema.org/ScheduleAction) + +## Object + +Objects refer to nodes in the content repository, or rather their addresses to be precise. +The node address concept is borrowed from the new event-sourced content repository +and enables Bitzer to address nodes that do not yet exist. +For example, a translation task can refer to creating a node variant that is still to be created via translation. +> Hint: For custom development purposes, there is an object repository available. + +## Agent + +Agents can be all of Neos' backend users having Bitzer's agent role, as well as all roles that extend it. +Thus, tasks can be assigned to a single user or a user group. +> Hint: A data source for agents is available and used in the Setting.Agent mixin node type. +> For custom development purposes, there is also an agent repository available. + +## Task + +Each task can be described by its properties: +* it is scheduled for a certain **scheduledTime** +* it has a certain **status**, e.g. active or completed (see https://schema.org/ActionStatusType) +* it is to performed by a certain **agent** +* it is about a certain **object**, in our case a node address +* it has a **target** URI, which directs the agent to their user interface to perform the task + +Additionally, tasks have metadata: +* a font awesome icon as an **image** +* a **description** +* arbitrary **properties** that might be relevant to the concrete task implementations + +> Hint: For custom development purposes, there is a task repository named "Schedule" available. + +Tasks themselves also have a lifecycle. They can be +* initially scheduled +* rescheduled to a different date +* reassigned to a different agent +* activated by an agent +* completed by an agent +* cancelled + +These actions are modelled as commands that are handed over to Bitzer, the central application service. + +--- + +
+< 1. User Interface +    |    + Index +    |    + 2. Writing custom tasks > +
diff --git a/Documentation/03_CustomTasks.md b/Documentation/03_CustomTasks.md new file mode 100644 index 0000000..9f20cec --- /dev/null +++ b/Documentation/03_CustomTasks.md @@ -0,0 +1,60 @@ +
+ < 2. Building Blocks > + | + Index +
+ +--- + +# 3. Custom Tasks + +While some generic tasks like review or translation will be provided by Bitzer's own plugin packages, +it is designed to allow for arbitrary tasks to be handled. There are a few steps to be taken for creating custom tasks. + +> Hint: To see custom tasks in action, please refer to https://github.com/sitegeist/bitzer-review + +## The task interface + +Each task must implement the provided `Sitegeist\Bitzer\Domain\Task\TaskInterface`. +While most properties are just members passed on by the schedule, some are useful for customization. +* getShortType should return a unique short name for the task +* getImage should return a font awesome icon name that can be used by the Neos UI +* getDescription can return a custom description, e.g. using the task's the properties array +* getTarget should return the custom URI of the location the agent can perform the task + +## The task factories + +Each type of task can define its own factory. Those must implement `Sitegeist\Bitzer\Domain\Task\TaskFactoryInterface` and must be registered via config: +```yaml +Sitegeist: + Bitzer: + factories: + 'Acme\Package\Domain\Task\MyTask\MyTask': 'Acme\Package\Domain\Task\MyTask\MyTaskFactory' +``` +If no custom factory is required, Bitzer's `GenericTaskFactory` is used. + +## Handling tasks + +The life cycle of custom tasks is to be implemented by the respective package. +Bitzer provides the same-named application service, repositories for tasks, objects and agents +and the signal `taskActionStatusUpdated` emitted by the `Schedule`. +What system events trigger automatic task generation is up to the specific use case. +For manually managing tasks there is a backend module available as well as a command controller. + +## Testing + +Bitzer provides feature traits for Flow's behavioral test framework based on Behat. +They can be used to +* create and simulate testing agents +* create testing objects +* perform commands on tasks + +to enable custom implementations with ample testing capabilities + +--- + +
+ < 2. Building Blocks > + | + Index +
diff --git a/Documentation/inspector.png b/Documentation/inspector.png new file mode 100644 index 0000000000000000000000000000000000000000..40a8e3b433ad3e6246c86fdc5a4f7af9c3bcb64e GIT binary patch literal 20556 zcmagE1z1+yx-LuzC@C${-7THc-QC>{FI@%#A|MSSAl==Kq;z+Kba%rUthLuVYybQF z=gjN-yg+cibB^&mcReFiNkI|?@hu`06cmcIl$Z(>6f`vy6b#c#81OeP%i5w)P}uw4 zYFch8#vUY2E{+z~cIG5*UQXsD=APCTP*9$8#XqbyC>q^^o@}v*KHid}NFL}o!V|T$ z5+(^N5Binb;lfdTP$5mR;6hxuISSCfGQ6jcujud6IjHu2+(`8yXtH{|IJywHzW4Qe z6!&RGTrO?&^z{v2QCaixe#l6jzGA5}XjwA4@$>UHfp2CPnO>fTElH!Olkr3W|LzVB-4{>)G%$3$+3 zpha0NfA2sgUvNr2qGyOtTo3KOdV|X|QXS85Sr@JH{Q}*gYGT|yKPpsw3L{~COQ+p+ z`EkK9s5`~O$P8Hy$Fql-_|OCQiHkT5bFpv?<#(;-Pa32tZ1r&l(WG%riKy>R%dCuw zzG-MzqKntW7|DN(yxJFLR*ug&x)@dqYsO->I_uUd&q}9W)+}SbCOg#El9MuP(?sN( zSYebv`oPV3%C6-l$D_dZS|*gQPSzpMKYBdlaL|W=-_$g;v|ku0l%^^q>PISkZ(qHV zP&_`zI~ls!I2D`nF&XB}oFBIN)jHS`D6;XzS{#)YixRSowPQAwQ#y{BJ*k0ZW42t= zx<`J<4!nup$A`Z|SS@~9Z)#hlaL(_$GW1z)sB7rg%RlAQ5)-HG-)XX1U59oN-9@G{ErLkQNYa<;M(VE`iSsH4uSIqWcy?0WH zWoN^2C0WlwRvJ;}Ib-}w5XZAIa3!T0D>Wse?BcG}{l`dI#k!iCF`rWk6CS9I_u1nUuoZ`+8W+AT}_Vb8OQ$l?z)HS?gMph zVNmQa!U9*}Zi4F{AKhUy-7UqQWBF0^q^yfow2DthF*jS*7upVO6n9Oa_;rhwYaO2| zlYf^z=}@=5#;bb!)suS0VinaQzeAo zX7tY63a$j*gdDnD^Z4HurRV6)#*iT?S}zy$J9&olOE)g^snst;$b*!=ejY-G!f4g1 zs%Yl(_2qYZW9b^UNtyFHSRFq(loc9hl|G?_okvz?d`?|ZTsrxwKbt)IHCLj6t_luX zVcgAC;jK&fd#v3d+Yz&33!6)}8FY`+Nd$Xtdk9^7Umq6aty%Ww#5OH22YL*S1}$>3 zu>Bf59 z@g1h_k`1%D+9y2#S2&UVrPF=ZA7RYNnI^xEPhvfKs7S>P8~EGthoCRS$*#zRrHQVs4=Nkn??$_xcY`El*1nt5oUC*hUR$ zv*lZxNU@5q@o*hYl(nIxyrth2bSHj_2=k47flMb`U#U!<3()xFzGkJWhvvkv;_SlwOYQF_7`)%;(Vh5 z3W=-M_T}oNdIX`Y2%O&%_T9QKOcz zb8c%!VQ$M)ypABJN(rkA^Cy}s@ddZD8P+E(zMbuiT9T~n&plf9pO-|S(MLqAQj>?< zDza?o-Kxo>}>Dj}hYqs?w`!ilt16Wzigvh)f zOb(Ldl>@mLWh<+l$LYl|dl|7b-?yXSiD=h1s#5pTZa?WjW0rsKlu?zUmP@&e-u!j% z3`g?92$eHBUxPLYst1NwZU={GvRxYFl=fp)_GgR+>Ir}Uke z`8-8T|K6Nj`PfuEyvR1c-S>l0Sb zLbQW)l{2;-pX5!fZt`DeZRi(LPNH3+dRVU`xqovt(=f3>5Hs zRZzWYW`$sVlf_Tc|+CQ3dRqL6zU{hcGcd zrubd+EB3Sxzi%WFQ|6(B4AcGc55<~-KFQTqvWCwx*hDpYDTFsoS~VNR@uu=?NtXLd znY`me@vaeJWD(j)aSSvUD2WB!E{%AU+a$;p^oIxrp4CNRnZlzFoG{_n@QFKjXJ4cg z_g(S}?Hj^oZW?!B^&CFceIT28^MG)}ZAB)*!1bUSnD~i8GTx^FyBQ|0jP4+(`E~$P zNekJondMdW)X9KHr_)bP=06w`hgnJodJ-8&yJU~BgA8GVZWN4*WH03HK01G3jQXLx zeGVJu*2jL?%ar)qXld+NB@N~E$7}0XX(u#+hzDm@e_`>F*E~c58t5a%zO8B5$xmU( z@4v4M{0og~+Wj~lXZ1<_GGjoyE3s`pUN!r>u-^B)bdhg40>~z01oKMrH!q4Zm-eHH z-19Lh){tE%dIzkgNdhzSvR}^*_~sK$cM(}FNz@Y}E9R!t1f3PYXLu{EVf&LbhKuW; zaw_rJX!n^7BKLgP2}aPJ)clI}z4hH&mPi2}2?p}&WrfZ=u@VWLZFng~mCs}e*B=>Z zaacBZKhaBK>@C+bqjumEp-Ho$9>8pAsyLz(6~kcBR%?gfem1niKxQ{;=T0D+&?C>T zmk*M(v-LYl!GVXCBA^QX=)ZW!Ra?T&dq}9b{F+n-)lM`(lBT4Kgs4Ycxh7Dk%0JL# zfS~NRybtq)mU8cxaOh8WqdDkVpWa|pyrDuq3-%NxgdyOQ+9SD85HOJ{dj0m+TS7Vm z3$`2We3)=AG}n}%Nzfq~;cmVxtl;|>JtHbJSDuIJMM|w8qt|m^TqgV$9UT}@ZvIF_ znq^B_Hk}J*OFlaA1irhG#PDqnUa61VhW^cBma&GA(K8G;7eiFe{V|&92sSN186IKf zJ-lXKl-;TtNzsmeQLRK@+Q1*2Kvu16$E({0>?N+H_IdXaK`5_%n3eZEKEXFCrzr6n7R2b{`GizHP-XZqbRFwps2_E%#xv)>vEuMOo zCYuS>n5YzD5dyU2h{ga;Y~;J&<0j+NFC3(P&{>v;*TK68Oso(eW z7Za>xSuf3mn6C+yl@@4q2~(Z8t_T{G71w%%JVqAK1 zG)n|UI8pac1svdcov28tprB)ay}F^bSV^8M;QgVPrn3K#@|FQ5ZU{FehvfDp=U;0m zBsNr9UE^Rj3RNd^Xfp9SsPRC?KcTz$%wMF0ZvCCj_L*$5qxH1(%yhy&Vc2{p;jJTI zLgoD7{blriB2>xb&Qz{|*Ak7sEtqTvKI}ZX?4E|`FSQo5Hf(-%PO4h(Oc%Ykmx35k z=0xDa{P!p$I(WITl@e5E40l4jZJJV5av9{+r>?Iyg`|w%X;wXz#{O{sK*vZjxI~@N zAKw{#wN8CT+Zw7&-Ii%2LejCC-s<Ib|9IPirLn!h}+$m37W@W?OQ}Nc}Ov_mQwK73HDSMqDCOq#jv;#0y3Xo-DN; z14b<3YDadg@$M$Xi7<;QMt(4E$mOJ5G+i&L@Dr>|f%K?_Vjpgeyg%lzK{~7%%avF~ z8^RC?G*Jrllr%!rx*rR6!H4BPROnYOE#O{~y21NJG*s)JMCZ!Oe4oq=zz~e$b3kl? z#duB8#e*^DtAZB&_a259<|oqihagkdoDQX$kINx&>92_1&*8;f@U%V5qd%=eT_vb~ z3#@-(oQI(0oN=y1osi>94ts|#0WCitm)5rQ;&y3Z9t;KTS&{s7 z1oSFDK4kJXzYix#6t4cv@N-i8{SEAKQ|U*}4fLYmi(NTaK@K?N9g<+154Ge@<)#bj zsVpcCeJn46Y_Z8Wn9cDW^?Az%x8bo;rj?;;I#SnvS&HN!qz3r>ez+qIXkpP59_S#g zsioiI&ufds_513c$qeoEQJf8u8X3WZgcTypd4wUfS=udbCqE}ZFR{OywHuZ12~!Ho zw&qSuV-@K7nq%7y{o@$<=u6+%XKS_zw&M2b!6mk&(o8}8#A7Rdjm5GBWt#Gm5-mG< zFHGL9zR==NCyg2WfRPxlUd}S4a|opXZ_|tXy`sLX(UsCArY;_r{t6vKd|7FgP7dqP zm0NJcafD4LDTB3Eek=zcPQg(`Dj*#{&$;C)K4%2 z9m0P8E;O6jIFrJV$E`K>a~a|Nbf~T*UAabEgUtM>4lFKzpQJ6r2ZPzb+-mz9c$QCC z6B)ru!797!pOGlaP|IRmxPyo~>WwV2690VQKY@ENXM8&-{RaO%W1_)%rY_OR(Dmp0 z&(09hlr$3iQ%qRZYWoGau_hsB##X|=kD1CsC?eA`pY3t-#zh2HxKbut0;WXMhP{V$ zV?QtDy6(hA?x~|?eEyNMrPX*HJ{;b1{x|QDp{wq^^TjIDTk(g#TTX8Y^VT{%E|PxF z!fMpv4dPsS{e7i7{j zn4|qv+C?Er?Y>n3o`1cb#C+{uVpC8IiboPK7Z8WdLUD4x#1D$4w=}M77qygBEGSRB z58f<&oXar(TE8<(ACG5E6hRg&Dzay!xflyk*cc1C^hDCYRJt{adq-6$CgUtA@Hl>! z;V%S&Fb9@vIHnno=(TBf8GGVDHv_cGwV5;~Vcg3F7+ zD~(BFg{0Ore|;zyd@LAW#W`XLI2k!uZLv6fh`q`6WT{O1Nw>eIyl`)JmI_dpUz>pfNYAqpii#AIc&oA5+t_nochm$P{eiNKe z7qJOBKkq*rEnRlp5j=b~Ir=@%NFxH(H#dIR&;+$57*#%m%u0|jxJoZ&;&t^xbSkvt zByl?dniEom{0jW&sEDlu!+bI6UMb;mT21}Yqm>1|S#fF)^S3e#wh_ni@>PT?nY`)M zbQ%JD2`-&zmf!OeyVUUGN7bwSJKK=1_H!|;#+-31Y~(e$=E^Rk70xk6{$YnzJ%-l0^9kzbns(e^A^nzE zQzFt0Tw;H1(pVTwAC&8>=dHUVdVc=$&$iLGRO0Yh2E%9~XzB6Dp7C82^_v_QL-kC{ z-@}e?%oNiyr}A2F?@>C7q6jX-M3bqd5^!B(;{xb-<|cOV_8+#a=X^93n}r>+K#% z7q=7fIwA4mCc$KsV9LwvOxFh~m(~aTz~jGVH9G2T-SnT*+3goOX5YQ&#T71bee&>3 z#jg|kyj6SUFpP4sjY9C|&U&XqG2s$|FkB%Q@UejQZv4BZMA(;KA-hOwEr<7e;g+vE zxoOkF7=D#biz|+_(UZWkILs^vAzW=GH#mBzAJ7yZkRSe7!S>p~Zb_DY*Rbho{B?GaND6URI~AYqQ`JZ`?39K6K=>A>P~8_*+IEZEi;O4i z4Fm5>5ll@9HES~&isCvQgZ74WcjmWNzX-CVfI(Qa>OChuQ}=faZ<-*I2_78x?LC~s z1fS1Gvd51-(2*lIUVqrz9yYMNMQ-E;c0Bdb22)buVMPvj+#0>H-Y?&y5f|ZS1gs-N zK>Yj4NlM!l3W|yR`G087Y$12>mk4gs^5O^^FVIjZ-jeSVhCo4)KuL?eSM!`ZSoG10 zfjsq`p!J|^7-guAq`SNx)P5j9d{3n1^(JHB9iENJ6bhlkAC>JExbYXV?_-6JK39kx zImJ?ud<;bu4~~{&%w1~3GWT4`a*^UvxO;Hk(aFnu>FF&*9NFlj*XX{|aCz#ZKRv_r z$)MRA9m(vm=jxQ)a8L7wy`NL|EOHwAqKG#*3azUs&2o$&(xBOSShBwpG)#z(-#k1d z!os46lB&}yad6elRtfD|yT0~JlB2>1ZP@H>W9OSdD`olaCo$S9oR7ao&*C7Q(h z_V)HfXJ!V5Z+P)ZxxWYC^GZyk*_*T-D@lL#N85@QP6{f^*4V;pc^VYhlGii&*9P{i zcXf5KCKMMHiHL|K_NS+($H&JHY}D1&)u7e7#g2`sY|@%rSYRmo`Zkq5Uyf#GX7={Q za#W_N@a*`%8iEx{($ieWkvJo{cyiu7pwx_vC}peUtI&xA#tD_A7+aED zy3#h9xd(iX5>3PAkq9V31B28A0O6e~R57f<^yX}MXG0&9Xa@TGJBafGN0FGDj-49m zOK+0WW;)(YjSSbr##B~R6ciQt&ge>KtI*RI*1K-$Xlw6mC4B$>`t@rgbMtDe(F~0v zO8%Fq!Q&CsOHQhIiYPOZ<+a_e__vs6gNG6BDON))%_BvJP&zOc(3s-qGWwfOZUc zJWD&c3u9@LeQa_x#)z78HVaFl+;bUSpDVL7&9jE2?}61LCMHHhLo3%Ry4$m~_=H)? zX|<&_?M38Qv?r`M$5mol`jxDpT0Rd!m^z?Td35KU< zXGcDTlDApIBk7_sF)@~dKg7jwaBw_QwrZFC_u33yri!%D(a{?{jvlu&Bj-HO)_WqC z%Zx?ezyAQLXx?>mYwK!vQkDh_2V0R&If?4-Byo-wq z@T@J82$o>q268q^D=+;DA6N0{-`&^IX;r4h~nRHrCcVSsY+RSRuO; z$y|;G4Q{>N-4?g!JFKj%_5+Ug_JnwNH+!Y6yKfs^`%3g1D=I7T-@ZK-3CIwWl-#54 zc`;RLD6}alE87nceYVol!wE89>&Q$`KOR@(cX#Rj1OtFJCnv|}>JSAPnIhu@EW*^} zB&+5i_%N^+dQ4YfN$czD)BG-zN`5l8-jB`C-)#;ix89%j7pNB|?zp?V%f>U{@wk|o znr7-TJ?$2jGU?T|Eo_0G8hGzyM@L7;#$r843VEHH0Z4oS1I=!!tQ-Zd;NYG(dQBaH zVUHy*%b}k`Rq>6s;a75T5kRL@z$aVG(PAp3kwTz zadF$JqTc>~S9f=VM)%^-(9qiF>k2@<(A|EehAKegN1W>BWO`*2+?YEWb>HhT1%RXjf2Sz1{5KU_=?tdeY! zhHO_33nufpZYHvt;xHQ&HA;hGQ=&P)xOf0>5n|ODf-d$B6c|2!^26O#sdgn56O+So zi=Q5o$3&j8=oe%>L0?bsPa-2Dr6_KP10KgCmam$xmdG=Pg`RxJbL3?cn40(4^vg|x zBr%qWY1Tczu0M07`zkL|^O~idWny4ppr;$DHfUz%()06k@S`G~Y8!xnpza1LD{5+ndV6~Z2hG3aa8C93ad2`H@w$bC45bPb z-Yq6ApB%4tfa2CE)_AfT0Ei*0ufGU((2Q*s*U)#g*~i0doRrC+DNmM(?)j3zHJC?W znQt`&1%pdS2$tQD-Msbb@h%g!*_ypx3{-^Xh^J)8Fz#iX}ZS7tDj$C!ob4%`T1=P zB(3l6@_L>AmE<9S1Bg{pQZg`R5p9~oj(fR3+o9KWPrn>B2`&K>YhKgtZ}q-6E z!2TtT8Xd3v2D@BRR7AjGqgIIP40guO&Tc48NXX^ypT?!LYTIeBg4_fOqN1N1JPIdA zeUXrm6cvXBd@l1QcR}MBHhGq7mKp%`7-*FtK$T2a(rfWeniYG;%1WA%lS4&TQBg6r z*qfqC1k^fNhH|C^-rKh|RaH#@=o<ucv6?5ulWMq8&^eHLSp1{P;5+WLmx(L`CaD$ZGN;vgcV^<*Vj?LBWp)8?BJG0cY*1CPf+u4M-O zhIgEt?!Zony|bGsJD9KCJMxAcE%_bHRfCS8i~HJTGCMP)*X+#!dbgqBcG@r?h1=Q0 z#%A~TCj>?Y20cAJPy$GZh+x@=3EJhQrLC>3Jns%_kA9v87MgAir2r+&PsB`4E}A*o zbiEeVPzb;ZtRHh4FQl)tvvXizf3Dg#fk|J4Cz4F)`C6WwyeRQO91yceMO`XQW-%6d zdVENNC6a>>FL(GI*#NW!)t;D4Ri_05C(Fcu`FFiP2Y zGfPW$T|H1v&3kv}a_3so`umMXEobNF$gf@*pMDw|0o1*{z0LPTK@V1yf+FhxmQHbm zt3zE^lOEA$?_J4}qXpo6wjDWEjTQ zb}upU4N;_}gM&Y)i{*ePKcEOAPa#-1C^f8d^^-E;!iOczv(S9;4zyLSAn2H{V(wPFlTdfVKw> z1Au8lKbvo|%z+3>&BFueJRq)a!J|bI3G~UKBL)GS(yz8r*Vfhs(EgoNG_i6N=({}y z3vE3;1}sG4UEc+OG#&!7+-KUt+zceK12`Ye5C=E{01Q8#O_*8(h{0N;-yi)SZo%KuVtoaAcs(3CkZG|L z_8))z+e^BA2p0TeZDP`HQvNMGynG)@$J)k5rEn5x2}1s<@>x3y1gER_12Z!N14Zk# zEGIlrfs)8CK;q~%%(HAU?tovMZ3p1bZ!?jH(6kC9VpG7AKTg=>hcH$a7N?!D zZ2Mt$@H0R{wX7XLTL|7CcTk^U@9gjYOiY~F z3mGN`#y{``KEiHT0EbZ(FFfhpCWUdb8anaF@&CRnL zW1gvd@|=joTdRQ8{1rqpAQh+ zEjOF^^?E~1FhKd(*%irA%~#uM3JV9OuNwBd4kWVLRO^sM$t80ZPjbh^$Gd}OIcm96 z2vBCwt2>TS6x43<^-_4ghT4OWQhxqyxjSrJSXh{tP+N4onggN0NjLt$2FUWhie*6d zrU<#6jIItB8&DvijsS|XCm4Ed#ARhsB+1n{F1LW_fHS!ns68N-J(m46nG$+BJ6W!P zT6{}H#1zxJ89|_}t`51}*Cx9KF$z#emxqlHX1$(+nb}`}I$~s_@r=5_OyoZKfKPhnkJ8phZx9KC zILFu5S56LWk|_m7FDL+GP~uw|T0ks-vId&??xcr!IGHO_o9b4hSf|=@n24(KpK=zM zwtHYLKso+ByFtQbGP6JeiJ;ZHr|TXefMGIJVqa08i0Sndi9FbOZFN zW{F;CWTa-{B#5)9$p8#2EcgNw1^5IA!orr8mhdeWlg<$ETqQcy1r-&i06&Eu&SRcK zOZ7BCKTwlw?Ckyh{XjM`VT2~`kVSzw#|ju%kVJtNF&gqHbX{!^O5yVWlAQ+YD_{`m z>@grKSi-u-#!gG-U(U|X_Cyj>X8_X(c((0(1vvlpd2|ofGN!mOi0?ckJx1w*ubhVB6%x5YUKzvKY66VqIBVi%v|G z5(C20j`I#6r-l1!;-C;9%*}V+xJ-IRhXvW$*;!ei`!_H~f%cdx(NB(#uK^wq{8xSQ zBIM7~QtF_^6F{+s>Dt2=Rf2+ofV}9Ln5Z%UQGriz0&5Ha9-#fJ(BH^^c!61K=m(I% zHO6K+Gm#Q6XJ~Dme|QQg4g8kw;A=d*db8eWTGgDatgQW|<~xI2m4+h+C*1MnJ^y2Y zWB1^m*zV7oYHAbty%2p!!(TQww%xrwkHZCPTU(!4H#iO$8#K=W|tt80IpERqXU#~#jG8f$q++7 z3k!>p#sQ$oT*Wj&_kFE^fPiu>{(#4O&Y=hsD=RH!Wmd3pi&&fd)$s7}s<{e)PD&36 z(14x+z7sg}QGwT@nzWhe>F=L<5P0Oz{aQ!-K`auCMhrxIUof#h4MylQ^Jt*m240QF zxrv4!{t^akV`OARjp9+ z6FkaTI6EUFBbfG_Z4UAUJT@Joz&@0?8GdsH;07SYwpwQ~g?+elaIhFmfq+T4YLo{F zK7JC|$N}^p8pG+Ti*?TAl$2f5(;mPfgLsl{yz=ow8g(C_N4GndN{c}oh*P$zB)^4f zWo69XSozTG?9EuVEJ!;X$aBGb2CN%f!u*?Uw?=o+7E?kz24HKR--3^5WMrfaRGp&G zLlt=Tva%770C(XU-h;#`(H1Bsbvkt~ullsKwETQ)cXv*7pjWFwSAtgsy9FF7BS6=S zU*J)J0|f#dd=eZS9KZ?fYMV)50}BfZ;86*zEG($vWW>ov!RtOT7; z3w1;Ihl$6#ySs@80}2m>joZXcAWfsDpkTp|w;$-XbEl$szN(rPyX?%|_ol*Un7|0FMK>*qW>&Hr{ME#R@2{{zq>&v6FG zPeD0)5RHU|hB`waz#0H-fH^~R_42v_9q$k9k9Zgk7-$d)cz+}0Qi_y@2dLxEYFBSsy6Qn5^y?SY9(=0qbr#xx zO3?p4jrBAs@cAC81H)fSMDabiM4?!NoIkMfdEDo9w&`c-v)$_NU}x8~rwOLjmwW%7 z=Kgz3^WUe${}1m8r1kL&Ht*FS+|*q|5_0m6KYz9(g&x})K3lpMot>WYf>aU|8mOun z;G}CThlYkY+1T1u;76`Tmg`cJlDq(vGV0cRBNAvh-~j_+pdiabpm{x8huYgS02Kl8 z3=G9BFs7B2mCK&%C}iFzUAW`pwtLJV31mJS$>?!Hf3RlH;Xe{avn z6+udC2ukIs^+}M5s(WGK9&{T36!Hu}M10)bAZhBJoAU-?`Ey(kc<2X*Es*bC{6wy3 zsyT9aLjLyv3G3W;#=x`H(*&YILE&vZp9Rn~^aH9RbwC{;!*fi^z))0J7}LK|38aXC zca==GPKz&(1`&VjB>E^&1-cp<5@JBU0x~PXj|aa5AUjcvEWe~=34D_-8VriIPj3=@ z4YDkdv!?QS9Cn6c0)PN6a!efzrX|F}!=E3r86YVL^Z?I&DMwAsd}wIo4S3{tO$T(C zp8gxW;E)#qA)&s$KFFdHiGlMk;Uk|8#iRx;oSw`sAmDfU7l3~+EIjfXPP-WdVqak~ zpzLmd6a*0#h^Ms~aKgIU!5TL3hD*3UDNl|#{g=CyS1z3NX!g?4nUf^;n<&&|22vJ0 zDi}M3hJff#OHXfqYYR-O&wwZQ2Qh?}*Rh_ahvopSe)zXJ@mk2Dcp*SJz4~B?Hd@5a1DH z>2otPMOx)10McO*P=E45c7fVEg3N>c0ge^ed`ok4bY(GH`4FdyLFsTF*qz>3skc}4cd&=OggxdvLS|VZo`(Va@w%papNI-D! zh6`~&X0yu%Vpta#xpeb>x&!SDd@Go2MQ)4&zCh5tsw$g$s|L2$nfR2AV;{SqiUEv!7$73+<)H9!;? z7QxzulS7HDpF)6KcLxztZbbtai1~PWz8(eP4iJrHA6H*Jk2;zF(uz^wgaMfbMrR6Q z)1`(1Iz0_w_79v@M2N#uQ)o4kVh)%O0IxyT;Jp6j@Km)a2>6kpIK;pQ-oVEBI%m_| zC7~rAsBN3P!yR{k1EABe`$53=Pqh5k;g|oJv`q@U|B;+rUb8am`J10(GJn$MGXfgW zuRGF@Q!ubTK0ZYhP~ZOd>6!n$!T%u>Xgk|XAAb91B*;U*Dp+7LfKp)KcrGd~35T{nq$OmAG zz+7Z{HgZfnEtbz|r46t<5D=b^_g)rXL6``@&Wk_Qfe1Ai^X*$e;suj7=4{&F5W@2S z$O>>Fa4F!SQd3jG-aI=*FznJPUi#lYn(S+6sI;OYH5tHM=9cUBrKLwO@HPy1fPl_0 zkUkE~kxQzun`PTn@6_{b=xG36={coKViV`;>gk~t5Lg7hnTrxYFu=Fv<)=lDWiY@D z`TBKCp9AQawY4?r7^>!*&16(mR1n((L2!9;0uuD=l}~6OXmD|1W8VU^8B7aG4TJQphDE-n@Ck!VU_Mo0r!g zkj_6nz_W=3I`?r*mYH?BK&=31k9<%lfVM#z0p^V}%|up!B!DD~i;G+KyCO^;B;s}= zF;F~S>BYvzHa9bKbNAH0(nn@X8u;@EWDr2k4TIMN;eO%dZV4e6*nkGHwY5zmE;VS@ zF)%n>Svdy%@md*p3Wp((sDnwvgF&PVAhAsmRn-`Y%$=!Xd;=A5e=yyh07G^k;ei}& z%c^O}5y3kyE+C{7lGuUBi5ZE<)%1`}c3d zsc31f!8(KZ_~olt^+(NJot7ia*TosylB#xwFHOb5ksE`&8_Jh@}y)8>QViE3RvR|CuH zKeGh20_{_;>C=56d)Sg@4&{kjeM_*=4Bza2IK9)N@e=A#eX)7r=}pd~aPWa#prm4V znco#0)IkK?(KNIhM+bsje0|_5>IyVMgT{eT5v=FOp8s}E@4o@{mC}pQf<77bg2c0{ z-uMg(b@OaG=|5y-Ya!8CV@3vz#Gi4QMRZ`7YEa?OV0qhYS&2juRh>Sa!+L%L6fRit6-I+5Zxi{1=f-qsXVRIoAs#AD(4=p>yg zqMom^DNP2aS7hV4RA4%7<`6v_y0ue7;`Mk|H%5`aNp!{sCxN&Tw%`@9VEm|Z7~MI- z$t8g8472=M1+po03lg7s0hRY+O-9lg!q}v1e8=L-*zH+aMv_H#o-GCB1#wi;j6siw z1HxUnil*k2y*AqhJ|@(dqT0PcNm;AvmT|m`k_}W0&@9ymng<>l3*363L%1tE>dfC)&*Hh@20 zFb-ulZ28707szB{Y+Me~(0$NB`9MTO5b$73Lc7sMNqydhYET2|trDRyuJt-MVgc+n z)_|suev>CU_yu%bU0pI6d3kY==jZ^-pm;$JT{-s{ z#sb)$a32Ux`(Yr*8s7fn#BAQ-=qn8MKJMSkRP~bdYSJPM{=h69H>p|nqDc)z)2qkP ziKkNBU)Fyk{FGf#1hp6%uAM;<#~-aICe|)yUeKE9Q%0efuR{4sTPrefmk4n>z*VNq zTw{ddk;UVwPNy_0R_f7@&x8lwA>!|r_%&kCDjUiaIlp|vw!RB}YphIbtD=e}+tV-- z@+PiiW6wr@NS+7=7SnfXcqFp>%DI*vL5BPQ;hzM*p$i&=fB1!ot+HJl5YIBD=Z_ZY zeu^j0l~69?ldqH@Rjq)zQHafUxFa%Gp+LwhVZ^2jQn{Iq{P~u{IdS)};=;4ExUUr@ z?k&d@kx^@jzD*or9CqZ@^n1+IU`%X!nb3DO;r>>7sf74@NJ{#WN)%naDIeEAEfVs? z6QpwUs%Vi*|0$qUp~d1*7{B*oAT#0lnh=sw)&MmLL5?#kadgXP@vprv(!&^tf)5cn zeJ3X7g%16S!yq5b3Zih2n8KHIzFxo$KTEGW&Jqj3u#(1KlQw{XLi4Jy;Gn83EG;F) zz)1*@eTa45Yd*DOvQI%9{YyjtU*%b<@WDMi0+8tpe1S~GC19oviaHMXuIGRL?*q>N zlF0vg!1-S?@|Z%CT1riQDFeV_1xAN>1OtP&FeIgriv9V#5V?dWB5X#5mca>+cGTgu z9>cGOp}`W7=ToRM;s!Q9pD3OPH9i!IdJU)(T&;8#@dv2@yp+Ox0L#>4luySzqwHZT zs~oM8MAHWKDzBv3Cfiw>x?TkRNaK6g*f!K^h%xFRDWbnwl~6(~9|dBGmMM z*O3!zI*z3Xn8RA>-2z!;AmK*sX5OFJKimc;MCC8WU)bb}MQlS&3cy6rhz&5tOT~&2 zv>?@*NSYL=h>Dq6_f+57ZZS)Dqla7*iFiP8GGNuNMvAzfr)L`{L61@SW1eX0Zc-nk zLu}Nt-$n$73>#~^Tt60m(tm7_E>e>zhm|JgxDJgXReTz`?ShSHS1|*CE+|732TBLqpGy z%Flvmcs>&pn1V)f)F`p+5Le5^$0SNQ6%D$Krys(H&WLeh-y-**3-)NLy|fYOaX*Y7 zZ1aC6V&KqS>1q^!Ra`O2{@!=&EFcUa%n_kdbrx8tA5ip7|79T=Js`t!py969f}ly+ zuZoUdUY7wR!aqtl=HnuygIMx4Q?F_soq8X?bXK6xmZ{U{P#1HXKysu#OeI3}C^lJ* z4$Nc5(2#2bnCRT@1DchWVi96u@xIWd67kt2Wbr;`yEX>zL$+8DS^_ZO?3NfdG0;yw zQij5)e-1fn!xdM5856AoPP#To%B*>5yKYg@IiI=+Ly*NaQoF@h+R0q75R3jM!C`yl zBbK!FM}=&Vt=OJcV2PR0BL9?#{w|eYP*Wq4ip7|}5(YJ>5FZeZB4ci!{Vy9G!-Ga$<7*@JB zUhx+pk|DkmGwX4!sKCsk>#DtiDxRTZ3g+g|74-8A&24)8p{F`Ps)B)DzSw~&a1BR# zul7?1Luqk2GVf2;*KKRx)V6-Hgk z9N3-C)DY(}J>{RLrFW{!KY|WAO&#Zy8Bky0n!(GmPC*xpXZFS9i@<#lF>szD%Xt&0 zR)B~NUy!24M$4`chl3T9*rTpV^BAufRH4%We_ky2N!^ZY%Z~wmMJ@0w{`Tl;N=lMQQMc0MT3v;=*mhsnrC;!OsAsVum zK;0C2T#GtWO?!@Q@T44fDuM+FSfK14TLL4;hh#kc%jgn%`*;Y)Ci~w>q!XRn zqxOjwl|788J7(@NNK;KsR6fg+qx`;q31x-eE0OY{nh{Rkl zA-UDn2&kXGKU_mY1u6}aDFvecIc5Jz_x}b*l1JL5+*JnSy^xT>W^Iw;Aq<40kq*8$ z6GYMhWc+vY;Mb4XWqNtV-8Sz3<1qRJ&doeF?967B-7U$f1N+&hGpy{LaV?u0Lh3|l z5a)e^Iv#nS*E4x_*LNd42JJ|NjjqbB3Z-JVlr7iV1=@{PXCT=V>U)>y-A#lTX^bOP zP~1$DjekJEsB7V|v+E~VMboh;0YSie!8Q%Jm-6EK!?RLV)0QfG{B;q5t%sovQGz-N z!DOqLF(n}?$jX+!>(VZ{*UFM_sfyX@vV6G@hf6vJ<4A}ePONj;l5JYu+$Z@9ohVTt zzY#TcKHXx7i2Pd{(bWY>+HD&>Ts+Qc*=K(L(!<=P6jq^oPY<&xTbW`k%`h#`RfeN* zQ9mZqTJ2lk1r!{XpjHwd(nY<>r? zx-2qFezq)tXuK_8NITnnP^Ii?oA&)S@3g(zoz#n*0`P~{>_TFtWm%-l9j{g|uh(xQ zXTRi&42t;q35t#0mk+XrjQR*t387SMUIM2&h_FB0o*!I2J0D%1^U`R(ovKW_`7{Ew zTgF*l<23jX#}tk*h%`Rjv#2z@bffx>=aVK1>R3y(YvyfkY=Zc2&3h7~dovpO+&^dq zhfFHCT>_yjijgmt&y0=`e)-k%r(XoiE-E%^*I11R;$dH2;>JkUQ>@WAk z|H2yZ#y!=c&7O*Mx)K-wid|}aNCH^25C-LvFz+0v$-nT?{~4wuAhv2=q5GEQT0u72 z41i3nNBTtMTszaqj>EYRqNcr--X!(fWvXi$UMS3aKDaIgPzZA&Va}nfaKRp!@1a>^ zp}JZ6O?0~PE+hw=)r_sb`@l6%Go~n;L=M9;NHthL!?l3e&IeMRHGZ)Dgo95rt_dr% zCM0Btw^)`&NN?Sf>NcuxC-qh3H@jF z)9}}320SMfZR^dQp~hIGRw7*6F`+dXjl*@WMi}tFSt5b6=*jq$er&LzvS%>q&WSk)mFRzbxVTfbmtQASEYE`OCLuDv5dsG)oHW}cqar(YsyL%ST zozQp9drvx@z42WAgHj3xS7WTJpILnU#iLc8f|~-Gd=}t>Su?Zy2~=^RR z=ci*CL>4F(JOx=PUeZrj{rt*+S6fk$v$k`pGwIM;dne5|UfpaG((dW~Zt-zH>e>5& zVRIIKR8-!5e-A3BW!s$?O-5R0xXnH{cfBEpxEeTDvG3rfRv#CiH!ufwY;qnh-Wax1 H@YnwUsE#D0 literal 0 HcmV?d00001 diff --git a/Documentation/module.png b/Documentation/module.png new file mode 100644 index 0000000000000000000000000000000000000000..6e35ece1e0825eaf41c2d38fee61de7355f7a9ff GIT binary patch literal 30000 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 A content lifecycle task manager for Neos CMS -![Screenshot of Task Reminder](./Docs/screenshot.png) +![Screenshot of Task Reminder](./Documentation/screenshot.png) -## Nothing to see here yet (except for the screenshot)! \ No newline at end of file +## The content life cycle + +From their initial creation until their final deletion, content repository nodes +pass different stages of maturity. A news article might be first published as an abstract +and then later on enriched with arbitrary media, then translated into a different language, +updated with references to other articles and so on. If these changes are to be implemented +in a planned way, we may model them as tasks. +Bitzer provides a task model, an overview for editors for tasks assigned to them +and an automation mechanism to generate new tasks, e.g. by defining a review date for a published news article. + + +## Installation + +``` +composer require sitegeist/bitzer +``` + +## Documentation + +1. [User Interface](./Documentation/01_UserInterface.md) +2. [Building Blocks: Objects, Agents and Tasks](./Documentation/02_BuildingBlocks.md) +2. [Writing Custom Tasks](./Documentation/03_CustomTasks.md)