tpr

AdminOnSteroids

Recommended Posts

4 hours ago, houseofdeadleg said:

Error: Using $this when not in object context

I cannot reproduce, sorry. Any further information on this?

Share this post


Link to post
Share on other sites

The custom CKE toolbars per role feature starts to get shape (continued from here).

I decided not to use roles but selectors instead for more flexibility (restrict by user role, name, email, etc).
There is also a field "filter" to restrict customizations to certain fields.

The biggest issue was figuring out how one could enter these infos in the admin. A full-fledged click-and-play UI was out of scope so the good old textarea-based solution seemed the best option. Even so it's not the simple key=value situation that I've used in the module a few times. I was about to use JSON but that's hard to write and error-prone so finally I made it with INI format, using parse_ini_string in the code. That worked so well that I will use it in the future for sure.

aos-custom-cke-toolbar.png.a6b93f9f932e989fb0ad915330340cce.png

I need to add a way to specify toolbar items to add/remove instead setting them directly, and it'll be ready for consumption :)

  • Like 2

Share this post


Link to post
Share on other sites
2 minutes ago, tpr said:

so finally I made it with INI format, using parse_ini_string in the code

Nice approach indeed!

  • Thanks 1

Share this post


Link to post
Share on other sites

v1.5.8 is uploaded so you can try the new "CKEditor customization" feature where you can set CKEditor toolbar buttons and other properties.

I think it's a pretty powerful feature with only a few lines of code, thanks to PW and using INI fomat in the configuration textarea.

For details, see the bottom of CKEaddons in the docs.

Plus I've reorganized the module assets including the compile/minify process, hopefully without any issues.

  • Like 3

Share this post


Link to post
Share on other sites
3 hours ago, tpr said:

I think it's a pretty powerful feature with only a few lines of code, thanks to PW and using INI fomat in the configuration textarea.

Nice one. How about using InputfieldAceExtended for the configuration textarea if it is installed?

if($this->modules->isInstalled('InputfieldAceExtended')) {
	$f = $this->modules->get('InputfieldAceExtended');
	$f->mode = 'ini';
	$f->modes = array('ini');
	$f->theme = 'twilight';
} else {
	$f = $this->modules->get('InputfieldTextarea');
}
$f->attr('name', 'CKEaddons_toolbar');
//...

2017-09-24_002320.png.b949cedf565a5519a2e69b77c4a4ed76.png

  • Like 2

Share this post


Link to post
Share on other sites

Not a bad idea, but how about highlight.js?

Share this post


Link to post
Share on other sites
5 hours ago, tpr said:

how about highlight.js

+1 so that we do not have to deal with dependencies

Share this post


Link to post
Share on other sites

Unfortunately highlight.js doesn't support textarea so I had to use CodeMirror. I'll be available in the next release.

Share this post


Link to post
Share on other sites
13 minutes ago, tpr said:

Unfortunately highlight.js doesn't support textarea so I had to use CodeMirror. I'll be available in the next release.

Cool.

But I do think it makes sense for utilities like CodeMirror or Ace to exist as separate inputfield modules so that they can be used elsewhere in Page Edit, other modules, etc, rather that duplicated within every module that uses them.

3 hours ago, szabesz said:

+1 so that we do not have to deal with dependencies

Things like this are not really dependencies (a plain textarea works fine without them) but more a progressive enhancement.

  • Like 3

Share this post


Link to post
Share on other sites

Makes sense but eg. for me who doesn't have Ace it's a drawback. Now I've modified the code to use Ace if it's installed, otherwise use CodeMirror.

Btw, with Ace the textarea height is only 3 rows here, how you managed it to make higher?

Update: solved it this way, but is there a way to autosize the Ace editor?

Spoiler

        if($this->wire('modules')->isInstalled('InputfieldAceExtended')) {
        	$f = $this->wire('modules')->get('InputfieldAceExtended');
        	$f->mode = 'ini';
        	$f->modes = array('ini');
        	$f->theme = 'twilight';
            $f->rows = 12;
        } else {
        	$f = $this->wire('modules')->get('InputfieldTextarea');
            $f->rows = 5;
        }

 

 

Share this post


Link to post
Share on other sites

Sorry to intervene with another topic but AOS stops Lister Pro from being able to list its own custom configured columns. With AOS enabled, its own "ListerTweaks" settings are enforced. It took me some time to figure out what is going on. @Rudy ran into the very same issue two weeks ago, and reported it in the Lister Pro forum as a "bug". These enforced "ListerTweaks" should be handled more gracefully I think. Fist of all, there should be an option to turn them off, letting Lister Pro do all this instead. Second, when it is turned on, there should be a notification for superusers above the listers in question as a reminder that AOS is "in effect".

What do you guys think?

Edited by szabesz
typo
  • Like 2

Share this post


Link to post
Share on other sites

I've worked on the "CKEditor customizations" feature and finally decided not to restrict on CKEditor field only. It was refactored to a new submodule called "FieldOverrides".

This way it is possible to set a bunch of field properties to override the defaults, in user, field or page contexts. Basically this is an extended version of the built-in field template overrides feature but for almost all field properties.

Some examples of what is possible:

aos-fieldoverrides.thumb.png.d737c6670fc83f0b49057ddcb289ca10.png

As you can see the syntax has changed a lot and there are some new keys too.

Syntax higlight works with InputfieldAceExtended and CodeMirror too, and in both cases the field auto-grows. CodeMirror uses files from the existing CKE plugins directory so the module's overall filesize hasn't grow much.

@szabesz I don't have ListerPro so it's hard to check things. You say that If you turn ListerTweaks off it's still active?

  • Like 4

Share this post


Link to post
Share on other sites
57 minutes ago, tpr said:

This way it is possible to set a bunch of field properties to override the defaults, in user, field or page contexts. Basically this is an extended version of the built-in field template overrides feature but for almost all field properties.

Awesome! I can see this being really powerful, and a nice alternative to working with hooks.

What do you think about adding an option for using a file to define these settings? For anything but the briefest snippets I much prefer working in my IDE (version control, etc). It could be a checkbox to activate the file-based option, or just check if "field-overrides.ini" exists in /site/modules/AdminOnSteroids/.  

  • Like 2

Share this post


Link to post
Share on other sites

Good idea, will implement it somehow.

  • Like 1

Share this post


Link to post
Share on other sites
13 minutes ago, Robin S said:

Awesome! I can see this being really powerful, and a nice alternative to working with hooks.

Okay, big flip-flop ahead... :D

...thinking some more, maybe this isn't such a good thing to add into AOS. It introduces another "language" to learn for doing something that is already possible with hooks. And @abdus has recently posted a tutorial for how to add other field settings into the template overrides that allows the admin GUI to be used. And I can see these ini-style settings being difficult to debug.

Don't know, I'm really in two minds about it. Be good to hear what others think.

  • Like 1

Share this post


Link to post
Share on other sites

I knew about @abdus article and considered going that way too. However I don't know how could I provide a UI for those hooks in one place like aos does how. Setting page/user conditionals would be another problem (from UI pov).

I don't think ini is a language/form a pw dev couldn't get in a few minutes so this doesn't seem to be an issue imo. aos already has a few non-conform field syntax, mainly key-value pairs, perhaps I'll convert them to similar ini-like fields later.

Lack of logging or such is an issue though. My best idea is to add notifications for superusers that some field properties are overridden by the module, on the page edit screen. I do not want to modify the original field edit page, that would lead to more confusions I think, and it wasn't easy in case of user/page conditions in effect.

As for the file-based settings I think I will prepend it to the admin contents if exists.

My biggest concern is that this submodule is too powerful, but it's for devs who should know what they are doing. And they can leave out this daily dose if they don't like it :)

Share this post


Link to post
Share on other sites
7 hours ago, Robin S said:

Be good to hear what others think.

Actually, I intentionally do not use any role based features of AOS and the reason for this is that I do not want my admin setups to depend on the module. All should still be usable and "the same" when AOS is disabled/uninstalled. For the same reason, I do not use it for loading "admin CSS and JS" either, for example, but there are other features too I do not use just because of this.

  • Like 1

Share this post


Link to post
Share on other sites
8 hours ago, tpr said:

@szabesz I don't have ListerPro so it's hard to check things. You say that If you turn ListerTweaks off it's still active?

Hm, I forgot how to turn it off so I could not do it. Now I see that clicking on the box turns stuff on and off. I will do some further testing on the weekend when I have the time.

Share this post


Link to post
Share on other sites
8 hours ago, Robin S said:

Don't know, I'm really in two minds about it. Be good to hear what others think.

Same here. I think I'll stick to hooks..

Another thing: with AOS turned on I have problems with cke fields. The header is sticky and if you have lots of buttons the textarea will get inaccessible (first screenshot is AOS off and it works):

Screenshot_20170928-092230.png

Screenshot_20170928-091301.png

Share this post


Link to post
Share on other sites

@tpr, I guess the question is "Why use ini format in the AOS config when you can just as easily use a hook?" The hook equivalent of the first two items in your screenshot is:

$wire->addHookBefore('Field::getInputfield', function(HookEvent $event) {
    $field = $event->object;
    $page = $event->arguments(0);

    // Add word counter for the "title" field for non-superusers
    if($field->name == 'title' && !$this->user->isSuperuser()) {
        $field->showCount = 2;
    }

    // Set year range for a date field, if template is "news"
    if($field->name == 'date_created' && $page->template == 'news') {
        $field->yearRange = '-3:+3';
    }
    
});

Comparing the hook option to the AOS config option my thoughts are:

  1. Once the hook function is in place and the $field and $page variables defined, the code for each field override is not significantly longer.
  2. It's plain PHP, so we're already familiar with the format.
  3. It's easier to read the conditionals.
  4. It's file-based.
  5. It's easy to dump/log within the hook.
  6. It saves any additional complexity being needed in AOS.
  • Like 2

Share this post


Link to post
Share on other sites

@bernhard I'll disable the position sticky for mobile screens.

@Robin S 

I see your points, but not everyone is capable of writing hooks. In fact the whole AOS wouldn't be needed because one could add their hooks/tweaks manually too. So yes, it's an abstraction but imo it makes things easier, maybe not for those who are familiar with hooks. In fact even for me it's easier to edit such an ini file (whether in admin or in a file) than writing hooks.

Perhaps I could use a PHP array instead ini when used from a file, and add a log key (command) to make logging easier but I guess this wouldn't help for those who prefer hooks instead.

Btw, "$page->template == 'news'" in your example is not valid, because in the admin the edited page is needed to be checked (template would return "admin" there always).

 

  • Thanks 1

Share this post


Link to post
Share on other sites
2 hours ago, tpr said:

I see your points, but not everyone is capable of writing hooks.

You're probably right. It won't hurt to add the feature and users can make up their own mind what they find easiest to use.

2 hours ago, tpr said:

Btw, "$page->template == 'news'" in your example is not valid, because in the admin the edited page is needed to be checked (template would return "admin" there always).

The $page argument for that method actually is the page being edited.

  • Like 1

Share this post


Link to post
Share on other sites

Hey @tpr - any chance you could add the "Show pagelist actions on full row hover" tweak to the sidepanel tree - the one that shows when you click this icon 59cfc586b33e2_ScreenShot2017-09-30at9_25_29AM.png.3ee83aecfd84e991210de11fd21116af.png in the breadcrumbs. 

I am starting to get into the habit of using that panel as a way to access the tree and I am really missing the full row hover.

On another note - what are your thoughts on supporting the new UiKit theme now? It is starting to look more usable (although I must admit I still don't see any real advantages over an AOS tweaked default theme), but it would be a nice option to have going forward. No pressure by the way - I know it's going to become painful keeping up with three different themes. It will be interesting to see what happens - will UiKit takeover as default - will the others stop getting core upgrades? Comes back to my desire for one theme which is easily skinnable, rather than different structures!

  • Like 4

Share this post


Link to post
Share on other sites

Took some time why it's not working there but finally found it - the CSS rule is active only above 960px screen width and the panel width usually below this. I'll fix this in the next release. Probably if you zoom the page out you'll see too.

I've checked the new UIkit theme and it's not bad. From AOS pov I saw only the language switcher that is misplaced but surely there are others too. I'll wait until more users will start to use it and if there will be too many AOS-related complains I'll start to fix them. I would be also happy if there would be only one theme to support.

  • Like 3

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

  • Similar Content

    • By thomasaull
      Some time ago I created a site profile for creation of a REST API with ProcessWire. Since I kept struggeling with updating stuff between different projects which use this, I decided to convert it into a module. It is now ready for testing: https://github.com/thomasaull/RestApi
      Additionally I added a few small features:
      automatic creation of JWT Secret at module install routes can be flagged as auth: false, which makes them publicly accessible even though JWT Auth is activated in module settings To check things out, download and install the module and check the folder /site/api for examples.
      If you find any bugs or can think of improvements, please let me know!
    • By kongondo
      Sites Manager
       
      16 September 2018:
      FOR NOW, PLEASE DO NOT USE THIS MODULE IN A PRODUCTION SITE. A  RECENT ProcessWire UPDATE HAS BROKEN THE MODULE. I AM WORKING ON A FIX.
       
      ################
       
      Sites Manager is a module for ProcessWire that allows Superusers to easily create/install ProcessWire sites on the same serverspace the module is running in. Only Superusers can use the module. You can create both stand-alone and multi-sites.
       
      Single/Stand-alone Sites
      Stand-alone or single-sites are sites that will run in their own document root/directory with their own wire and site folders, .htaccess, index.php, etc. In other words, a normal ProcessWire site.
      Multiple Sites
      Multi-sites are sites that will run off one wire folder (shared amongst two or more sites) each having their own site folder and database. In this regard, it is important to note that Sites Manager is not in itself a multiple sites solution! Rather, it is a utility that helps you create multi-sites to be run using the ProcessWire core multiple sites feature. For more on this core feature, see the official ProcessWire documentation, specifically the solution referred to as Option #1.
      Option #1 approach requires the site admin to initially install ProcessWire in a temporary directory for each new site. The directory then needs to be renamed as site-xxx, where ‘xxx’ is any name you want to use to differentiate the installation from other sites, before it is moved to the webroot. For instance, site-mysite, site-another, site-whatever. In addition, the /wire/index.config.php file must be copied/moved to the webroot. Each time a site is added, the index.config.php has to be edited to add ‘domain’ => ‘site-directory’ key=>value pairs for the site. This process can become a bit tedious. This module aims to automate the whole multi-site site creation process.
      The module is based off the official ProcessWire installer. Creating a site is as simple as completing and submitting a single form! You also have the option to type and paste values or reuse a pre-defined install configuration.
       
      The module will:
      Install a ProcessWire site in your named directory, applying chmod values as specified
      Move the directory to your webroot
      Update/Create a Superuser account as per the submitted form, including setting the desired admin theme and colour
      For multi sites, update sites.json (used by index.config.php to get array of installed sites)
       
      For multi sites, the only difference in relation to the core multi-sites index.config.php is that this file is slightly different from the one that ships with ProcessWire.
      Download from GitHub: Sites Manager (Beta Release)
      Features
      Install unlimited number of sites in one (multi-sites) or independent (single-site) ProcessWire installs. Install by completing a Form, Typing or pasting in configurations or using pre-created install configurations. Choose an Admin Theme to auto-install along with the site installation. For single-sites installation, download, save and reuse ProcessWire versions of your choice. Install and maintain site profiles for reuse to create other sites. Create install configurations to speed up installation tasks. Client and server-side validation of site creation values. Edit uploaded profiles (e.g., replace profile file). Lock installed sites, configurations and profiles to prevent editing. Bulk delete items such as site profiles, installed site directories and/or databases (confirmation required for latter two). View important site details (admin login, chmod, etc). Links to installed sites home and admin pages. Timezones auto-complete/-suggest. Pre-requisites, Installation & Usage
      Please see the documentation.
      Technicalities/Issues
      Only Superusers can use the module.
      ProcessWire 2.7 - 3.x compatible
      Currently using ProcessWire 2.7 installer (install.php)
      For multi-sites, potential race condition when sites.json is being updated on a new site install vs. index.config.php accessing the json file?
      Not tested with sub-directory installs (for instance localhost/pw/my-site-here/)
      Currently not doing the extra/experimental database stuff (database charset and engine)
      Future Possibilities
      Install specified modules along with the ProcessWire install
      Profile previews?
      Credits
      @ryan: for the ProcessWire installer
      @abdus: for the index.config.php reading from JSON idea
      @swampmusic: for the challenge
      Video Demo
      Demo  showing how quick module works on a remote server [YMMV!]. Video shows downloading and processing two versions of ProcessWire (~takes 7 seconds) and installing a single/stand-alone ProcessWire 3 site using the new Admin Theme UI Kit (~2 seconds) on a remote server.
       
      Screens
      1

      2

       
       
    • By Robin S
      Breadcrumb Dropdowns
      Adds dropdown menus of page edit links to the breadcrumbs in Page Edit.

      Installation
      Install the Breadcrumb Dropdowns module. The module requires ProcessWire >= v3.0.83 and AdminThemeUikit.
      There is a checkbox option in the module config that determines if the breadcrumb dropdowns will include pages that the user does not have permission to edit.
      Features/details
      The module adds an additional breadcrumb item at the end for the currently edited page. That's because I think it's more intuitive for the dropdown under each breadcrumb item to show the item's sibling pages rather than the item's child pages. In the dropdown menus the current page and the current page's parents are highlighted in a crimson colour to make it easier to quickly locate them in case you want to edit the next or previous sibling page. Unpublished and hidden pages are indicated in the dropdowns with similar styling to that used in Page List. If the option to include uneditable pages is selected then those pages are indicated by italics with a reduced text opacity and the "not-allowed" cursor is shown on hover. There is a limit of 25 pages per dropdown for performance reasons and to avoid the dropdown becoming unwieldy. If the current user is allowed to add new pages under the parent page an "Add New" link is shown at the bottom of the breadcrumb dropdown. If the currently edited page has children or the user may add children, a caret at the end of the breadcrumbs reveals a dropdown of up to the first 25 children and/or an "Add New" link. Overriding the listed siblings for a page
      If you want to override the siblings that are listed in the dropdowns you can hook the BreadcrumbDropdowns::getSiblingsmethod and change the returned PageArray. For most use cases this won't be necessary.
      Incompatibilities
      This module replaces the AdminThemeUikit::renderBreadcrumbs method so will potentially be incompatible with other modules that hook the same method.
       
      https://modules.processwire.com/modules/breadcrumb-dropdowns/
      https://github.com/Toutouwai/BreadcrumbDropdowns
    • By bernhard
      Some of you might have followed the development of this module here: https://processwire.com/talk/topic/15524-previewdiscussion-rockdatatables/ . It is the successor of "RockDataTables" and requires RockFinder to get the data for the grid easily and efficiently. It uses the open source part of agGrid for grid rendering.
       
      WHY?
      ProcessWire is awesome for creating all kinds of custom backend applications, but where it is not so awesome in my opinion is when it comes to listing this data. Of course we have the built in page lister and we have ListerPro, but none of that solutions is capable of properly displaying large amounts of data, for example lists of revenues, aggregations, quick and easy sorts by the user, instant filter and those kind of features. RockGrid to the rescue 😉 
       
      Features/Highlights:
      100k+ rows Instant (client side) filter, search, sort (different sort based on data type, eg "lower/greater than" for numbers, "contains" for strings) extendable via plugins (available plugins at the moment: fullscreen, csv export, reload, batch-processing of data, column sum/statistics, row selection) all the agGrid features (cell renderers, cell styling, pagination, column grouping etc) vanilla javascript, backend and frontend support (though not all plugins are working on the frontend yet and I don't plan to support it as long as I don't need it myself)  
      Limitations:
      While there is an option to retrieve data via AJAX the actual processing of the grid (displaying, filtering, sorting) is done on the client side, meaning that you can get into troubles when handling really large datasets of several thousands of rows. agGrid should be one of the most performant grid options in the world (see the official example page with a 100k row example) and does a lot to prevent problems (such as virtual row rendering), but you should always have this limitation in mind as this is a major difference to the available lister options that do not have this limitation.
      Currently it only supports AdminThemeUikit and I don't plan to support any other admin theme.
       
      Download: https://gitlab.com/baumrock/FieldtypeRockGrid
      Installation: https://gitlab.com/baumrock/RockGrid/wikis/Installation
      Quikckstart: https://gitlab.com/baumrock/RockGrid/wikis/quickstart
      Further instructions: https://gitlab.com/baumrock/RockGrid/wikis/quickstart#further-instructions
      Changelog: https://gitlab.com/baumrock/FieldtypeRockGrid/raw/master/changelog.md
       
      Module status: alpha, License: MIT
      Note that every installation and uninstallation sends an anonymous google analytics event to my google analytics account. If you don't want that feel free to remove the appropriate lines of code before installation/uninstallation.
       
      Contribute:
      You can contribute to the development of this and other modules or just say thank you by
      testing, reporting issues and making PRs at gitlab liking this post buying me a drink: paypal.me/baumrock/5 liking my facebook page: facebook.com/baumrock hiring me for pw work: baumrock.com  
      Support: Please note that this module might not be as easy and plug&play as many other modules. It needs a good understanding of agGrid (and JavaScript in general) and it likely needs some looks into the code to get all the options. Please understand that I can not provide free support for every request here in the forum. I try to answer all questions that might also help others or that might improve the module but for individual requests I offer paid support for 60€ per hour (excl vat).
       
      Use Cases / Examples:
      Colored grid cells, Icons, Links etc. The Grid also has a "batcher" feature built in that helps communicating with the server via AJAX and managing resource intensive tasks in batches:

      Filters, PW panel links and instant reload on panel close:

      You can combine the grid with a chart library like I did with the (outdated) RockDataTables module:

    • By Ken Muldrew
      I'm trying to get a short routine to run once per day that will look at some pages and send a reminder email when that customer's subscription (yearly) is about to expire. When I run the code in a template then it works without issue, but inside my lazycron service routine, I get an "Error: Uncaught Error: Call to a member function get() on null" as if the database cannot be found. My autoload module is just the sample HelloWorld module included with ProcessWire, editted to perform this task. The whole of it is included below (I've stripped out the code that generates the email because it never gets past $pages->find):
       
      <?php namespace ProcessWire;
      /**
       * ProcessWire 'LazyCronLoad'  module
       *
       */
      class LazyCronLoad extends WireData implements Module {
          public static function getModuleInfo() {
              return array(
                  'title' => 'LazyCronLoad', 
                  'version' => 1, 
                  'summary' => 'Just loads a lazy cron callback.',
                  'singular' => true, 
                  'autoload' => true, 
                  );
          }
          public function init() {
              // initialize the hook in the AutoLoad module
              $this->addHook('LazyCron::everyDay', $this, 'myHook');
              
          }
          public function myHook(HookEvent $e) {
              // called once per day
              wire('log')->save('user_activities',' lazy cron service routine');
                  $transport_pages = $pages->find("template=aggregate-entry, aggregate_type.title='Transport'");
                  foreach ($transport_pages as $page) {
                      if (($page->purchase_date + 30325800 < time()) && ($page->purchase_date + 30412600 > time())) { // between 351 and 352 days
                          wire('log')->save('user_activities', $page->id . ' email reminder sent');
                          // send email
                  }
              }
          }        
          
      }
      The first wire('log') shows up but the second one doesn't (the purchase_date condition is met (as demonstrated by running the code in a template close in time to when the lazycron routine executes)). The error log gives the Uncaught Error shown above. 
      I think this is a beginner's mistake with something obvious being missed and would be grateful for any assistance in fixing it.