Jump to content
LostKobrakai

InputfieldChosenSelect

Recommended Posts

InputfieldChosenSelect

This topic (https://processwire.com/talk/topic/71-categorizingtagging-content/) showed the need for a Inputfield that would provide a real tagging UI to be useable with FieldtypePage. It uses the chosen library, which can be found here http://harvesthq.github.io/chosen/. It's meant for MultiPageFields and works kinda like asmSelect, but with a different skin.

post-874-0-37585200-1422635930_thumb.png

Features:

  • Inline adding of new tags, which will then generate the corresponding pages.
  • Sortable tags.

Usage

  • Install the Module
  • Edit your pagefield and choose InputfieldChosenSelect as inputfield.
  • Use Enter or Tab to create new Pages with the currently typed name.
  • Enter will fill in the tab currently selected in the dropdown.

http://modules.processwire.com/modules/inputfield-chosen-select/

https://github.com/LostKobrakai/InputfieldChosenSelect

Edited by LostKobrakai
Removed "approval pending"
  • Like 19

Share this post


Link to post
Share on other sites

Is there a way to make readme-images, which come from github, work in the module directory?

Like this: <img src='https://github.com/LostKobrakai/InputfieldChosenSelect/raw/master/screen.png' /> in your README

Since this will be the modules support forum, please add instructions here on how to install and use it. Also add in your README, thanks.

Edited by kongondo

Share this post


Link to post
Share on other sites

I've added usage instructions, but the potential stumbling block of first adding the module in the settings of InputfieldPage is now included in the modules installation. So there's really not much left.

Share this post


Link to post
Share on other sites

@LostKobrakai - just playing with this now and I like it - thanks, but there is a bug :)

In InputfieldChosenSelect.js you have:

$(".InputfieldPageTags select[multiple=multiple]").each(function() {

I am not actually sure how that would ever work since that approach would need the name of the field, eg if your field name is: tags

$(".Inputfield_tags select[multiple=multiple]").each(function() {

but this also works and won't be dependent on the field's name:

$(".InputfieldChosenSelect select[multiple=multiple]").each(function() {
  • Like 1

Share this post


Link to post
Share on other sites

Features on the "maybe" list:

  • Inline adding of new pages.

This is in-built in ProcessWire and it already works with your Inputfield. I have tested and it works fine unless I am missing something?

A request: Do you know if it is possible to sort the tags by drag and drop like in asmSelect? In your case this would have to be horizontal, of course..

  • Like 1

Share this post


Link to post
Share on other sites

@adrian

Shoot, renamed the module locally from InputfieldPageTags to InputfieldChosenSelect, that's why it was still there :) Fixed it.

@kongondo

With inline I mean really in the field where the tags are, so that new pages are also shown in a tag ui if you hit tab or enter. Currently you can only use the autocomplete in this field and add pages below. 

  • Like 1

Share this post


Link to post
Share on other sites

I see, but adding pages below has the advantage of being able to add multiple pages in one swoop. I wouldn't want to reinvent the wheel myself, but of course, it's your decision :-)

I edited my post above: Did you see my request? 

Edited by kongondo

Share this post


Link to post
Share on other sites

No offense kongondo, but I would actually really like to see the inline way of adding new tags/pages - Since they are already typing, I think that is what many users would expect to be able to do, rather than needing an additional field. 

Nico's https://github.com/NicoKnoll/TextboxList works like this, but of course it would be great to have this in this module so everything is connected to the page field.

  • Like 1

Share this post


Link to post
Share on other sites

I wouldn't reinvent much, I would just add the ability to add new tags and in the background, as this works kinda like asmSelect, it would just add items to a select input. To the request of sorting these. It's not possible out of the box, as the library is meant to be a progressive enhancement for selectboxes, where you're normally not able to sort stuff. I'll see if this would be addable with a little jQueryUI's sortable.

  • Like 2

Share this post


Link to post
Share on other sites

Yeah I found a few github repos with that feature added, too. Updated all those snippets to work with the new version of chosen and here we go. Inline adding and sorting is now working.

  • Like 5

Share this post


Link to post
Share on other sites

Love the enhancements, but I am getting something weird - if I only enter 2 characters and then hit enter, it creates a new tag for to match those 2 characters, and then randomly adds a second tag to the list.

post-985-0-20394300-1422636666_thumb.png

Then hit enter and I get this:

post-985-0-24994000-1422636860_thumb.png

 
Edited by adrian
Fixed incorrect attachments

Share this post


Link to post
Share on other sites

Yeah the code to to distinguish between "still options available" and "definitely a new page" is not working perfectly. For now I've updated it to just use TAB to create a new one and ENTER for choosing from the dropdown.

Share this post


Link to post
Share on other sites

Nice stuff.

A question though. If i remember correctly Chosen loads the entire dataset into the DOM. I'm wondering if this could potentially lead to performance issues when working with a lot (thousands) of pages to choose from. Solutions like select2 or selectize.js (both jQuery based) allow for partial loading of remote datasets in some form. Maybe you chose Chosen for a good reason but i was just wondering.

Share this post


Link to post
Share on other sites

>> Inline adding of new tabs, which will then generate the corresponding pages.

Should be "new tags" ?

  • Like 1

Share this post


Link to post
Share on other sites

If i remember correctly Chosen loads the entire dataset into the DOM. 

I don't know about all the other inputfields, but chosen is based on the exact multi select inputfield, which asmSelect is built on. I don't know about the performance of the library itself, but the base DOM containes all elements for both inputfields.

Share this post


Link to post
Share on other sites

Nice module. I'll try it soon :)

I build an inline edit module with Tokeninput with free tagging and ajax data source, but I build it for frontend use and not a Inputfield.

Share this post


Link to post
Share on other sites

Btw, seems the inline creation of new tags changes the tag's title case to lower case (must be the js). Since this are used to create page titles, is it possible to change this behaviour? i.e. If I enter the tag 'Tech', I expect that and not 'tech'. 

Share this post


Link to post
Share on other sites

Yeah, was to eager to do the comparison of available tags and new tags in lowercase. Should have been only in the if statement and not for the whole value. I've uploaded a fixed version, so it should work now.

  • Like 4

Share this post


Link to post
Share on other sites

Just a quick request - can you make it possible to override these:

    AbstractChosen.default_multiple_text = "Select/Enter tags";
    AbstractChosen.default_single_text = "Select an Option";
    AbstractChosen.default_no_result_text = "No results match";

Thanks again for this - it's coming in very handy, although client feedback unfortunately is saying that the "Tab" to create a new tag is confusing - any chance you can revisit making Enter work in all situations? Sorry for sounding demanding :)

Share this post


Link to post
Share on other sites

From the api you can just use these as with all options available: https://harvesthq.github.io/chosen/options.html.

$inputfield->setChosenOption('no_results_text', "Text");
$inputfield->setChosenOption('placeholder_text_multiple', "Text");
$inputfield->setChosenOption('placeholder_text_single', "Text");

I don't know if that's enough for you to hook ::render and inject these. 

Regarding the Tab / Enter situation. I'm quite good in js by now, but the sourcecode of chosen is still somewhat complex. The last time I searched I didn't find a way to check if there are still elements left in the dropdown or not. I'll take another look into it tomorrow.

Share this post


Link to post
Share on other sites

I've updated the module to give users the ability add pages with Enter as well. Let me know if there are any problems. 

Edit: I've also added some more fitting styles for AdminThemeReno.

post-874-0-55306500-1423931907_thumb.png

  • Like 4

Share this post


Link to post
Share on other sites

Awesome - so much better with Enter working to add tags - thank you!

As for the no results/placeholder text - I might just go with some jquery.

Thanks again for a fantastic job on this - it really is the best solution for tags fields!

  • Like 2

Share this post


Link to post
Share on other sites

Just had one more thought for you - how hard do you think it would be to also offer this as an inputfield for Ryan's new Options fieldtype, in addition to the Pages fieldtype that is currently uses. Thought it might be nice because with tags it is often unlikely that you actually need these to be accessible via a URL, hence no real need for having them as pages now that we have this new fieldtype. 

Just thinking out loud if you are looking for something to do :)

  • 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 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 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: https://github.com/blaueQuelle/privacywire/tree/master
      Download: https://github.com/blaueQuelle/privacywire/archive/master.zip
      I would love to hear your feedback 🙂
      Edit: Updated URLs to master tree of git repo
       
    • 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
    • By dimitrios
      Hello,
      this module can publish content of a Processwire page on a Facebook page, triggered by saving the Processwire page.
      To set it up, configure the module with a Facebook app ID, secret and a Page ID. Following is additional configuration on Facebook for developers:
      Minimum Required Facebook App configuration:
      on Settings -> Basics, provide the App Domains, provide the Site URL, on Settings -> Advanced, set the API version (has been tested up to v3.3), add Product: Facebook Login, on Facebook Login -> Settings, set Client OAuth Login: Yes, set Web OAuth Login: Yes, set Enforce HTTPS: Yes, add "https://www.example.com/processwire/page/" to field Valid OAuth Redirect URIs. This module is configurable as follows:
      Templates: posts can take place only for pages with the defined templates. On/Off switch: specify a checkbox field that will not allow the post if checked. Specify a message and/or an image for the post.
      Usage
      edit the desired PW page and save; it will post right after the initial Facebook log in and permission granting. After that, an access token is kept.
       
      Download
      PW module directory: http://modules.processwire.com/modules/auto-fb-post/ Github: https://github.com/kastrind/AutoFbPost   Note: Facebook SDK for PHP is utilized.


×
×
  • Create New...