Jump to content

Recommended Posts

@zoeck I implemented modal editing for the collection panels. See the latest release. You can set the mode to modal or blank for edit or view links.

The modal auto-closes on page save and the panel reloads via AJAX when an edit modal closes.

/* Open edit links in modal, view links in new tab */

$panels->add([
  'panel' => 'collection',
  'data' => [
    'editMode' => 'modal',
    'viewMode' => 'blank',
  ],
]);

 

  • Like 2

Share this post


Link to post
Share on other sites
5 minutes ago, Jens Martsch - dotnetic said:

I found the solution, I have to include the hook before the require in admin.php

I could make that a bit more obvious in the documentation 🥂

  • Like 1

Share this post


Link to post
Share on other sites

It would also be nice, if you provide a complete copy and paste solution for the admin.php, so one could directly see a working example. This requires of course to install all submodules.

Share this post


Link to post
Share on other sites

@gmclelland There's a few good ideas in there! I do have an at-a-glance/counter panel on the roadmap, but I'm not sure how to exactly build that since ProcessWire — as opposed to Wordpress — doesn't have any pre-configured content types, so I would have to make it a bit more configurable.

I also like the idea of having different tabs, although it's not a requirement I see many pages having. It should be relatively simple to implement, though (apart from the permissions stuff).

Share this post


Link to post
Share on other sites
6 minutes ago, Jens Martsch - dotnetic said:

It would also be nice, if you provide a complete copy and paste solution for the admin.php, so one could directly see a working example.

I'm planning on revamping the documentation at some point — split it into sub-pages and make it more navigable. Next on the list is an example section with code snippets for all panels, as you suggested.

  • Like 1

Share this post


Link to post
Share on other sites

It would also be nice, if I could add panels as an array of arrays (or objects) like

$panels->add([
        [
            'panel' => 'number',
            'title' => 'Neue Seiten',
            'data' => [
                'number' => 484,
                'detail' => '100 mehr als im vorigen Monat',
                'trend' => 'up',
            ]
        ],
        [

            'panel' => 'page-list',
            'title' => 'zuletzt bearbeitete Seiten',
            'data' => [
                'collection' => 'template=basic-page, limit=10',
                'sortable' => true,
            ],
        ]
    ]);

Right now, it seems, that I have to use $panels->add for every single panel, is that correct?

Share this post


Link to post
Share on other sites
7 minutes ago, Jens Martsch - dotnetic said:

Right now, it seems, that I have to use $panels->add for every single panel, is that correct?

i agree here with this – i actually tried to add an array of panels first before I realized you had to do each panel on a different call..

  • Like 1

Share this post


Link to post
Share on other sites
1 hour ago, Jens Martsch - dotnetic said:

Right now, it seems, that I have to use $panels->add for every single panel, is that correct?

@Jens Martsch - dotnetic @Macrura Correct. The problem here is that the config object is an array, and the outer array is also an array. There's no way of telling if it's a config array or a collection of config arrays without it getting ugly.

Luckily, WireArray has an import() method for that exact purpose. I added a release on GitHub that supports adding an array of panels via $panels->import([]);

  • Like 2

Share this post


Link to post
Share on other sites
4 hours ago, d'Hinnisdaël said:

I do have an at-a-glance/counter panel on the roadmap, but I'm not sure how to exactly build that since ProcessWire — as opposed to Wordpress — doesn't have any pre-configured content types, so I would have to make it a bit more configurable.

Couldn't you loop over all templates(excluding system templates) and use the template's name along with a count?

For example:

  • Basic Page (55)
  • Calendar Postings (77)
  • Job Postings (88)
  • community-event (55)  <- this one doesn't have a friendly template name, the others above do
  • Total Pages (400)

It would probably be helpful to show file information as well.  Like:

  • Documents (1,000)
  • Images (2,000)
  • Audio (30)
  • Videos (40)
  • Total Files (3,000)

The number of users would be helpful per role

  • Editors (20)
  • Contributors (25)
  • Vendors (22)
  • System Admins (2)
  • Total Users (60)

All of that would probably need to be cached so isn't too taxing on the server.  Maybe only displayed to admins as well?  I thought I remembered a module that already provides similar counts?  I can't remember the name. Maybe I'll remember it later?

  • Like 2

Share this post


Link to post
Share on other sites
15 hours ago, d'Hinnisdaël said:

@zoeck I implemented modal editing for the collection panels. See the latest release. You can set the mode to modal or blank for edit or view links.

The modal auto-closes on page save and the panel reloads via AJAX when an edit modal closes.


/* Open edit links in modal, view links in new tab */

$panels->add([
  'panel' => 'collection',
  'data' => [
    'editMode' => 'modal',
    'viewMode' => 'blank',
  ],
]);

 

This does not work directly, only after I have written the following code into the admin.php file

wire('modules')->get('JqueryUI')->use('modal');

But after that, it work likes a charm 😉 Thanks!

 

 

and I still have a few ideas for the PageList:

  • open collapsed
  • edit in modal, too 😉 

and one little design bug in the PageList:

  • showRootPage => false -> no margin/padding left/right/bottom

Share this post


Link to post
Share on other sites

@gmclelland I can see this getting a bit out of hand with a CMF like ProcessWire that doesn't set any boundaries on the shape content can take.

The most versatile solution would be to create an at-a-glance panel, but to rely on the programmer to supply the counts that are relevant to their site.

I can see the template and role counts working the way you suggested. Still, not all templates are meaningful units of content, e.g. a `country` template for populating forms is really not that interesting to site editors. The role naming / pluralization would only work in English here (e.g. vendor becomes Vendors), so there'd need to be a way of naming them in other languages.

The documents and images are a bit more complicated, however. ProcessWire doesn't have a central media or file library to get a count from. So you need to run a cronjob to scan the site for images across all pages. You'd also need to figure out which images are meaningful content (photos) and which are e.g. system-created QR codes for event invitations.

How do you count videos? I have a file field called videos, and a repeater field with a video_url field. There's no way of counting that without doing it yourself.

Don't get me wrong, I like the idea, but I don't think automating it is feasible or the right solution in ProcessWire. I'll be happy to be convinced otherwise 🌝

  • Like 1

Share this post


Link to post
Share on other sites
6 minutes ago, zoeck said:

This does not work directly, only after I have written the following code into the admin.php file


wire('modules')->get('JqueryUI')->use('modal');

Strange. I added that to the module itself and it only worked for me after I added it:

protected function includeModalScripts() {
  $this->modules->get('JqueryUI')->use('modal');
}

/* And then later */

if ($modal) {
  $this->includeModalScripts();
  $button->class .= ' pw-modal pw-modal-large';
}

 

Share this post


Link to post
Share on other sites
24 minutes ago, d'Hinnisdaël said:

Strange. I added that to the module itself and it only worked for me after I added it:


protected function includeModalScripts() {
  $this->modules->get('JqueryUI')->use('modal');
}

/* And then later */

if ($modal) {
  $this->includeModalScripts();
  $button->class .= ' pw-modal pw-modal-large';
}

 

You Added it to "renderButton" in the "DashboardPanel" Class, but the Modal is used in the "renderPageActions" Function in the "DashboardPanelCollection.module" (The renderButton/renderFooterButton isn't used in the Collection)

When you add "$this->includeModalScripts();" to "if (self::windowModeModal === $mode) {" (Line 300) it works 😄 

  • Like 2

Share this post


Link to post
Share on other sites
1 hour ago, zoeck said:

When you add "$this->includeModalScripts();" to "if (self::windowModeModal === $mode) {" (Line 300) it works 😄 

You're right of course 👽 I have a custom panel that already includes the modal script, so I never noticed. I pushed a fix that should work.

Thanks for debugging!

  • Like 3

Share this post


Link to post
Share on other sites

@zoeck Slow day in the office — I added the editMode and viewMode options to the PageList panel as well. See the latest release.

$panels->add([
  'panel' => 'page-list',
  'title' => 'Information',
  'data' => [
    'parent' => 'template=basic-page, name=info',
    'editMode' => 'modal',
    'viewMode' => 'blank',
  ],
]);

 

  • Like 2

Share this post


Link to post
Share on other sites

When I add 'editMode' => 'modal' to the collection panel, this pops up: PHP Notice: Undefined index: host in ...\Dashboard\DashboardPanel.class.php:329 Perhaps you could use isset? 

if (isset($info['host']))

When modal is closed, there is an error in the console: Uncaught ReferenceError: UIkit is not defined Dashboard.js?v=0.5.0-1579071638:2 Can't debug this as js is minified.

Share this post


Link to post
Share on other sites

I guess "Add dashboard page to user dropdown navigation" isn't supported in AdminThemeDefault?

Share this post


Link to post
Share on other sites
19 minutes ago, matjazp said:

I guess "Add dashboard page to user dropdown navigation" isn't supported in AdminThemeDefault?

I'm using the standard AdminThemeFramework::getUserNavArray hook. Looks like that's a newer addition and not available on default.

Any particular reason you're still using the default theme? I switched all of my client sites over to UiKit and I don't regret it. The old one looks so... old.

  • Like 3

Share this post


Link to post
Share on other sites

This is amazing. Going to try this one out this week. I’m excited to see google analytics in the road map. Keep up the great work!!!!!!

Share this post


Link to post
Share on other sites

Some encoding problems, this is how it looks when dashboard is empty:

Learn how to add and configure panels reading the <a href="https://github.com/philippdaun/processwire-dashboard" target="_blank">documentation</a>.

I guess documentation should be a link.

 

EDIT: I see now it's multilanguage issue, 

 

Edited by matjazp

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 BitPoet
      Here's a small new module that started as a spinoff of a memcache proof-of-concept. Cache your strings and partials in-memory using Redis as a backend.
      CacheRedis
      All you need is a running Redis database. The module supports connection through regular TCP, over TLS and via unix domain sockets. Host and port are configurable, and authentication is supported too. Here's a screenshot of the module configuration options:

      I'll not go into too many details about the usage, you can see everything explained in the README on GitHub, and just highlight the most important points.
      When the module is active, you'll have a wired $redis variable, which means you can reach the module as $redis, wire("redis") or within Wire classes / modules as $this->redis.
      CacheRedis is strongly influenced by WireCache, and its usage is (hopefully) straight forward.
      // Store an entry in the cache under the given key name with the given value: $redis->store("cached_value_number_one", $expire, $value); // Retrieve a value from the cache $value = $redis->fetch($key); // Delete a cache entry $redis->delete("my_other_cached_value"); // Clear the whole cache $redis->flush(); // Retrieve a value from the cache, and if not found, create it through the given function // and store it with a lifetime of 5 minutes (300 seconds) $value = $redis->fetch($key, 300, function() use($page) { return "Page last changed on " . strftime('%m/%d/%Y %H:%M', $page->modified | $page->created); }); // Render a file using wireRenderFile and store it in the cache. // We'll pass a selector as the expiry value so this cache gets // emptied every time a page matching the selector is saved. $news = $redis->renderFile("partials/news.php", 'template=blog-post', ["page" => $page]); The module is still very crude work in progress, but I hope some of you feel daring, try it out and let me know in case anything breaks.
      Have fun!
    • By joshua
      This module is (yet another) way for implementing a cookie management solution.
      Of course there are several other possibilities:
      - https://processwire.com/talk/topic/22920-klaro-cookie-consent-manager/
      - https://github.com/webmanufaktur/CookieManagementBanner
      - https://github.com/johannesdachsel/cookiemonster
      - https://www.oiljs.org/
      - ... and so on ...
      In this module you can configure which kind of cookie categories you want to manage:

      You can also enable the support for respecting the Do-Not-Track (DNT) header to don't annoy users, who already decided for all their browsing experience.
      Currently there are four possible cookie groups:
      - Necessary (always enabled)
      - Statistics
      - Marketing
      - External Media
      All groups can be renamed, so feel free to use other cookie group names. I just haven't found a way to implement a "repeater like" field as configurable module field ...
      When you want to load specific scripts ( like Google Analytics, Google Maps, ...) only after the user's content to this specific category of cookies, just use the following script syntax:
      <script type="optin" data-type="text/javascript" data-category="statistics" data-src="/path/to/your/statistic/script.js"></script> <script type="optin" data-type="text/javascript" data-category="marketing" data-src="/path/to/your/mareketing/script.js"></script> <script type="optin" data-type="text/javascript" data-category="external_media" data-src="/path/to/your/external-media/script.js"></script> <script type="optin" data-type="text/javascript" data-category="marketing">console.log("Inline scripts are also working!");</script> The type has to be "optin" to get recognized by PrivacyWire, the data-attributes are giving hints, how the script shall be loaded, if the data-category is within the cookie consents of the user. These scripts are loaded asynchronously after the user made the decision.
      If you want to give the users the possibility to change their consent, you can use the following Textformatter:
      [[privacywire-choose-cookies]] It's planned to add also other Textformatters to opt-out of specific cookie groups or delete the whole consent cookie.
      You can also add a custom link to output the banner again with a link / button with following class:
      <a href="#" class="privacywire-show-options">Show Cookie Options</a> <button class="privacywire-show-options">Show Cookie Options</button> This module is still in development, but we already use it on several production websites.
      You find it here: PrivacyWire Git Repo
      Download as .zip
      I would love to hear your feedback 🙂
      CHANGELOG
      0.0.5 Multi-language support included completely (also in TextFormatter). Added possibility to async load other assets (e.g. <img type="optin" data-category="marketing" data-src="https://via.placeholder.com/300x300">) 0.0.4 Added possibility to add an imprint link to the banner 0.0.3 Multi-language support for module config (still in development) 0.0.2 First release 0.0.1 Early development
    • By MoritzLost
      This is a new module that provides a simple solution to clearing all your cache layers at once, and an extensible interface to perform various cache-related actions.
      The simple motivation behind this module was that I was tired of manually clearing caches in several places after deploying a change on a live site. The basic purpose of this module is a simple Clear all caches link in the Setup menu which clears out all caches, no matter where they hide. You can customize what exactly the module does through it's configuration menu:
      Expire or delete all cache entries in the database, or selectively clear caches by namespace ($cache API) Clear the the template render cache. Clear out specific folders inside your site's cache directory (/site/assets/cache) Refresh version strings for static assets to bust client-side browser caches (this requires some setup, see the full documentation for details). This is the basic function of the module. However, you can also add different cache management action through the API and execute them through the module's interface. For this advanced usage, the module provides:
      An interface to see all available cache actions and execute them. A system log and logging output on the module page to see verify what the module is doing. A CacheControlTools class with utility functions to clear out different caches. An API to add cache actions, execute them programmatically and even modify the default action. Permission management, allowing you granular control over which user roles can execute which actions. The complete documentation can be found in the module's README.
      Beta release
      Note that I consider this a Beta release. Since the module is relatively aggressive in deleting some caches, I would advise you to install in on a test environment before using it on a live site.
      Let me know if you're getting any errors, have trouble using the module or if you have suggestions for improvement!
      In particular, can someone let me know if this module causes any problems with the ProCache module? I don't own or use it, so I can't check. As far as I can tell, ProCache uses a folder inside the cache directory to cache static pages, so my module should be able to clear the ProCache site cache as well, I'd appreciate it if someone can test that for me.
      Future plans
      If there is some interest in this, I plan to expand this to a more general cache management solution. I particular, I would like to add additional cache actions. Some ideas that came to mind:
      Warming up the template render cache for publicly accessible pages. Removing all active user sessions. Let me know if you have more suggestions!
      Links
      https://github.com/MoritzLost/ProcessCacheControl ProcessCacheControl in the Module directory

    • By David Karich
      Admin Page Tree Multiple Sorting
      ClassName: ProcessPageListMultipleSorting
      Extend the ordinary sort of children of a template in the admin page tree with multiple properties. For each template, you can define your own rule. Write each template (template-name) in a row, followed by a colon and then the additional field names for sorting.
      Example: All children of the template "blog" to be sorted in descending order according to the date of creation, then descending by modification date, and then by title. Type:
      blog: -created, -modified, title  Installation
      Copy the files for this module to /site/modules/ProcessPageListMultipleSorting/ In admin: Modules > Check for new modules. Install Module "Admin Page Tree Multible Sorting". Alternative in ProcessWire 2.4+
      Login to ProcessWire backend and go to Modules Click tab "New" and enter Module Class Name: "ProcessPageListMultipleSorting" Click "Download and Install"   Compatibility   I have currently tested the module only under PW 2.6+, but think that it works on older versions too. Maybe someone can give a feedback.     Download   PW-Repo: http://modules.processwire.com/modules/process-page-list-multiple-sorting/ GitHub: https://github.com/FlipZoomMedia/Processwire-ProcessPageListMultipleSorting     I hope someone can use the module. Have fun and best regards, David
×
×
  • Create New...